xslt-2.0 相关问题

将此标记用于特定于XSL Transformations版本2.0的问题,而不是其他版本。

XSLT:从交叉引用中提取值

我正在尝试从与交叉引用 id 匹配的 aff 元素中提取值,但不确定使用什么 XPath 来获取特定的匹配值。 XML: 我正在尝试从与交叉引用 id 匹配的 aff 元素中提取值,但不确定使用什么 XPath 来获取特定的匹配值。 XML: <article> <contrib-group> <contrib contrib-type="author"> <name><surname>Doe</surname><given-names>Jane</given-names></name><email>email here</email><xref ref-type="aff" rid="affa">a</xref><xref ref-type="corresp" rid="cor2">*</xref> </contrib> <contrib contrib-type="author"> <name><surname>Done</surname><given-names>John</given-names></name><email>email here</email><xref ref-type="aff" rid="affb">b</xref> </contrib> <aff id="affa"><label>a</label>Department of Philosophy, <institution>University of XXX</institution>, <country>Germany</country></aff> <aff id="affb"><label>b</label>Institute of Logic, <institution>Univeristy of YYY</institution>, Virginia, <country>United States</country></aff> </contrib-group> </article> XSLT: <xsl:template match="*"> <article> <xsl:apply-templates select="//contrib-group/contrib"/> </article> </xsl:template> <xsl:template match="article/contrib-group/contrib"> <contrib> <surname><xsl:value-of select="name/surname"/></surname> <given-names><xsl:value-of select="name/given-names"/></given-names> <email><xsl:value-of select="./email"/></email> <affiliation> <xsl:if test="xref/@rid = following-sibling::aff/@id"> <xsl:value-of select="following-sibling::aff"/> </xsl:if> </affiliation> </contrib> </xsl:template> 我知道这里的<xsl:value-of>不正确 - 如何选择与@rid匹配的相应链接@id? 输出为我提供了两个贡献的隶属关系: <article> <contrib> <surname>Doe</surname> <given-names>Jane</given-names> <email>email here</email> <affiliation>aDepartment of Philosophy, University of XXX, Germany bInstitute of Logic, Ohio, United States</affiliation> </contrib> <contrib> <surname>Done</surname> <given-names>John</given-names> <email>Email here</email> <affiliation>aDepartment of Philosophy, University of XXX, Germany bInstitute of Logic, Ohio, United States</affiliation> </contrib> </article> XSLT 有一个内置的 key 机制来解决交叉引用。 XSLT 2.0 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="aff" match="aff" use="@id" /> <xsl:template match="/article"> <xsl:copy> <xsl:apply-templates select="contrib-group/contrib"/> </xsl:copy> </xsl:template> <xsl:template match="contrib"> <xsl:copy> <xsl:copy-of select="name/* | email"/> <affiliation> <xsl:value-of select="key('aff', xref[@ref-type='aff']/@rid)/(node() except label)" separator=""/> </affiliation> </xsl:copy> </xsl:template> </xsl:stylesheet> 应用于您的输入示例,这将返回: 结果 <?xml version="1.0" encoding="UTF-8"?> <article> <contrib> <surname>Doe</surname> <given-names>Jane</given-names> <email>email here</email> <affiliation>Department of Philosophy, University of XXX, Germany</affiliation> </contrib> <contrib> <surname>Done</surname> <given-names>John</given-names> <email>email here</email> <affiliation>Institute of Logic, Univeristy of YYY, Virginia, United States</affiliation> </contrib> </article>

回答 1 投票 0

XSLT 2 或 3 - 使用 for-each-group : group-starting-with 向平面 XML 文件添加结构

我收到了一个 Verity .otl 文件,并被要求“解码”,以便可以重新制定所有规则。 我很自然地想到将文本文件转换为 XML 并对其进行处理。我的第一张...

回答 1 投票 0

如何在XSLT中指定小于或等于?

我正在尝试编写如下逻辑来返回数据。 ...

回答 1 投票 0

我如何将未解析的文本函数包装在一个条件中,以便它不会一直被调用?

跟进问题如何将动态文件名传递给 xslt 中的未解析文本函数? 我有以下代码片段: 跟进问题如何将动态文件名传递给 xslt 中的未解析文本函数? 我有以下代码片段: <xsl:variable name="PDFNAME" select="InvoiceIndicators/PdfFileName"/> <xsl:variable name="vText" select="tokenize(unparsed-text('../data/ebpp/fopinvoices/arn/emfe_afp/sample.txt'),'&#xD;&#xA;')"/> <xsl:message>value of unparsed-text is <xsl:value-of select="$vText"/> </xsl:message> <xsl:variable name="PDFFileStatus"> <xsl:for-each select="$vText"> <xsl:if test="contains(.,$PDFNAME)"> <xsl:value-of select="substring-after(.,',')"/> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:message><xsl:text>PDFFileStatus :</xsl:text> <xsl:value-of select="$PDFFileStatus"/> 我在代码的其他部分使用变量 PDFFileStatus 并对其进行检查。 例如在我的代码的某些部分, <xsl:when test="DunningSummary and $PDFFileStatus='Found'"> <xsl:value-of select="generate-id(DunningSummary)"/> </xsl:when> 到目前为止,代码运行得很好。但在某些情况下,我不想输入我编写未解析文本函数的代码。 就像用 if 条件包装它一样: <xsl:if test="InvoiceIndicators/LetterTypeCode = 'PU'"> <xsl:variable name="imagename" select="substring(substring-after(InvoiceDetails/InvoiceNumber, '_'), 3, 9)"/> <xsl:variable name="vText" select="tokenize(unparsed-text(concat('../data/ebpp/fopinvoices/arn/emfe_afp/', $FileName, '.txt')),'&#xD;&#xA;')"/> <xsl:message>value of unparsed-text is <xsl:value-of select="$vText"/> </xsl:message> <xsl:variable name="PDFFileStatus"> <xsl:for-each select="$vText"> <xsl:if test="contains(.,$imagename)"> <xsl:value-of select="substring-after(.,',')"/> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:message><xsl:text>PDFFileStatus :</xsl:text> <xsl:value-of select="$PDFFileStatus"/> </xsl:message> </xsl:if> 但现在我遇到了代码片段的问题,我在其中添加了对变量 PDFFileStatus 的检查。 遇到这种情况我该如何处理? 根据您想要使用该函数的评论 unparsed-text-available https://www.w3.org/TR/xpath-functions-31/#func-unparsed-text-available 然后仅在以下情况下使用 unparsed-text未解析文本可用检查返回 true。

回答 1 投票 0

xml节点限制显示

得到以下xml文件 史密斯 米尔顿 44 第五夏季街,MNTB 得到以下xml文件 <persns> <prsn> <fname>Smith</fname> <lname>Milton</lname> <age>44</age> <addrss>5th summer st, mntb</addrss> <city>Portland</city> </prsn> <prsn> <fname>Ken</fname> <lname>Jackson</lname> <age>37</age> <addrss>19th Penfield ave, brtcl</addrss> <city>Kelowna</city> </prsn> <prsn> <fname>Susan</fname> <lname>Arkland</lname> <age>48</age> <addrss>34th Mansfield st, sgtp</addrss> <city>Raleigh</city> </prsn> <prsn> <fname>George</fname> <lname>Bond</lname> <age>35</age> <addrss>5th drive, mntb</addrss> <city>Albany</city> </prsn> <prsn> <fname>Ron</fname> <lname>Davis</lname> <age>37</age> <addrss>12th Greenfield ave, brtcl</addrss> <city>Pheonix</city> </prsn> <prsn> <fname>Marie-Ann</fname> <lname>Spencer</lname> <age>48</age> <addrss>273 Simpson square</addrss> <city>Oklahoma</city> </prsn> <prsn> <fname>David</fname> <lname>Rhonson</lname> <age>45</age> <addrss>255 Lakeland Terrace, mi</addrss> <city>Livonia</city> </prsn> </persns> 并且,出于分页目的,需要将子节点显示限制为每页仅显示 3 个项目。 为此,必须有两个(或者可能是一个..)模板。 第一个,像这样 <xsl:variable name="frme" select="3" /> <xsl:template match ="persns"> <xsl:apply-templates select="prsn[position()mod$frme=1]"/> </xsl:template> 第二个,类似这样的东西(不起作用..) <xsl:template match="/prsn"> <!-- do some html table formatting and display those particular prsn's name, age etc --> </xsl:template> 因为只有第一个模板被实际触发并按顺序显示(几乎正确)所有 8 或 9 prsn 节点详细信息,所以第二个模板被简单地忽略(这是正确的)。 问题是如何假定格式一次显示有限数量的子节点及其子特征:年龄、地址、城市等。 已经问过此类问题,但是通过旧的 xslt 2 无框处理器,该工作解决方案对我来说不太有效。 我强烈需要这种解决方案,直到我切换 Saxon 处理器并设置前面提到的答案。 提前非常感谢您。 虽然有一些明显的延迟,但我会以某种方式展示这个堆叠数据(分页)显示的解决方案,就像几个月前最初在这里出现的那样。 也许有些人仍然对如何做到这一点感兴趣;尤其是这种“完整”的解决方案,人们几乎找不到......而且我真的知道我在说什么! 无论如何..这是另一个先前稍微修改过的(简化的)xml 文件: <persns> <prsn> <fname>Smith</fname> <lname>Milton</lname> <age>44</age> <addrss> <strt>5th summer st, mntb</strt> <zipcd>78455509</zipcd> <city>Portland</city> </addrss> </prsn> <prsn> <fname>Ken</fname> <lname>Jackson</lname> <age>37</age> <addrss> <strt>19th Penfield ave, brtcl</strt> <zipcd>872356223</zipcd> <city>Kelowna</city> </addrss> </prsn> <prsn> <fname>Susan</fname> <lname>Arkland</lname> <age>48</age> <addrss> <strt>34th Mansfield st, sgtp</strt> <zipcd>341289654</zipcd> <city>Raleigh</city> </addrss> </prsn> . . . . . <prsn> <fname>David</fname> <lname>Rhonson</lname> <age>45</age> <addrss> <strt>255 Lakeland Terrace, mi</strt> <zipcd>6000432217</zipcd> <city>Livonia</city> </addrss> </prsn> <prsn> <fname>Buddy</fname> <lname>Clark</lname> <age>53</age> <addrss> <strt>Lkeshore Lane Zion, il</strt> <zipcd>45230976521</zipcd> <city>Oneonta</city> </addrss> </prsn> <prsn> <fname>Peggy</fname> <lname>Johnson</lname> <age>42</age> <addrss> <strt>w.Devon ave. Monroe Township, nj</strt> <zipcd>3456872112</zipcd> <city>New Jersey</city> </addrss> </prsn> <prsn> <fname>Julie</fname> <lname>Nelson</lname> <age>35</age> <addrss> <strt>Wagon st.Springfield,pa</strt> <zipcd>76245127832</zipcd> <city>Pennsylvania</city> </addrss> </prsn> </persns> 通过我将进一步介绍的 xslt 转换,人们希望像通过以下图片展示的那样显示它(以及功能): 所以,xslt 变换如下所示: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" html-version="5"/> <meta charset="UTF-8" name="viewport" content="width=device-width, height=device-height, initial-scale=1.1"/> <xsl:variable name="url" select="base-uri()"/> <xsl:param name="pag"> <xsl:choose> <xsl:when test="$url = substring-before(concat($url,'?'),'?')"> <xsl:value-of select="1"/> </xsl:when> <xsl:otherwise> <xsl:analyze-string select="$url" regex="[\?&amp;]([^=]+)=([^&amp;]+)"> <xsl:matching-substring> <xsl:value-of select="regex-group(2)"/> </xsl:matching-substring> </xsl:analyze-string> </xsl:otherwise> </xsl:choose> </xsl:param> <xsl:variable name="windw" select="3"/> <xsl:template match="persns"> <xsl:variable name="rcrds" select="count(persns/prsn)"/> <xsl:variable name="pags" select="ceiling(count(prsn) div $windw)"/> <xsl:variable name="start" select="($pag - 1)*$windw + 1"/> <xsl:variable name="lmt" select="prsn[position() ge $start and position() &lt; $start + $windw]"/> <table border="1" style="border-collapse:collapse"> <xsl:for-each select="$lmt[1]/*[not(self::addrss)]"> <xsl:variable name="i" select="position()"/> <tr><th><xsl:value-of select="name()"/></th> <xsl:for-each select="$lmt"> <td> <xsl:value-of select="*[$i]"/> <xsl:if test="$i mod 3=1"> <xsl:text> [</xsl:text> <xsl:element name="span"> <xsl:text>+</xsl:text> <xsl:attribute name="id"> <xsl:choose> <xsl:when test="position()mod3=1"> <xsl:text>cp1_rcrd01</xsl:text> </xsl:when> <xsl:when test="position()mod2=0"> <xsl:text>cp2_rcrd01</xsl:text> </xsl:when> <xsl:when test="position()mod3=0"> <xsl:text>cp3_rcrd01</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:attribute name="class"> <xsl:text>cSsmbl_01</xsl:text> </xsl:attribute> <xsl:attribute name="onclick">fnct(this,'cpz1','cpz2','cpz3')</xsl:attribute> </xsl:element> <xsl:text>]</xsl:text> </xsl:if> </td> <th> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="position()mod3=1"> <xsl:text>cpz1</xsl:text> </xsl:when> <xsl:when test="position()mod2=0"> <xsl:text>cpz2</xsl:text> </xsl:when> <xsl:when test="position()mod3=0"> <xsl:text>cpz3</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:value-of select="addrss/*[$i]/name()"/> </th> <td> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="position()mod3=1"> <xsl:text>cpz1</xsl:text> </xsl:when> <xsl:when test="position()mod2=0"> <xsl:text>cpz2</xsl:text> </xsl:when> <xsl:when test="position()mod3=0"> <xsl:text>cpz3</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:value-of select="addrss/*[$i]"/> </td> </xsl:for-each> </tr> </xsl:for-each> </table> <!-- First/Prev link for pagination --> <xsl:choose> <xsl:when test="number($pag) ge 1"> &#160;<a id="pida" href="index.html?pag={number($pags)-number($pags)+1}" onclick="">&lt;&lt;First</a> &#160;<a id="pida" href="index.html?pag={number($pag)-1}" onclick="">&lt;Prev</a> </xsl:when> <xsl:otherwise> <!-- display smthing else --> &#160;<a><xsl:attribute name="href">index.html?pag=<xsl:value-of select="number($pag)"/></xsl:attribute>&lt;&lt;Prev</a> </xsl:otherwise> </xsl:choose> <xsl:if test="$pags gt 1"> &#160;<b><xsl:value-of select="number($pag)"/>&#160;/&#160;<xsl:value-of select="number($pags)"/></b>&#160; </xsl:if> <!-- Next/Last link for pagination --> <xsl:choose> <xsl:when test="number($pag) lt number($pags)"> &#160;<a id="nida" href="index.html?pag={number($pag)+1}">Next&gt;</a>&#160; <a id="nida" href="index.html?pag={number($pags)}" onclick="">Last&gt;&gt;</a> </xsl:when> <xsl:otherwise> <!-- display smthing else --> </xsl:otherwise> </xsl:choose> <!-- end of pgntn sect --> </xsl:template> </xsl:stylesheet> 但是,等等,有一个小的 .js 脚本实际上控制页面转换。 所以这个如下: function fnct(spn,cpz1,cpz2,cpz3) { setCcmpzt_01=document.getElementsByClassName(cpz1) /* 1'st hdr-col pair */ setCcmpzt_02=document.getElementsByClassName(cpz2) /* 2'nd hdr-col pair */ setCcmpzt_03=document.getElementsByClassName(cpz3) /* 3'rd hdr-col pair */ tblAtbCcpz=[setCcmpzt_01,setCcmpzt_02,setCcmpzt_03] if(spn.innerHTML=='+') { spn.innerHTML='-' switch(spn.id) { case 'cp1_rcrd01': for(j=0;j<tblAtbCcpz[0].length;j++) tblAtbCcpz[0][j].style.display="table-cell" break case 'cp2_rcrd01': for(j=0;j<tblAtbCcpz[1].length;j++) tblAtbCcpz[1][j].style.display="table-cell" break case 'cp3_rcrd01': for(j=0;j<tblAtbCcpz[2].length;j++) tblAtbCcpz[2][j].style.display="table-cell" break } } else { spn.innerHTML='+' switch(spn.id) { case 'cp1_rcrd01': for(j=0;j<tblAtbCcpz[0].length;j++) tblAtbCcpz[0][j].style.display="none" break case 'cp2_rcrd01': for(j=0;j<tblAtbCcpz[1].length;j++) tblAtbCcpz[1][j].style.display="none" break case 'cp3_rcrd01': for(j=0;j<tblAtbCcpz[2].length;j++) tblAtbCcpz[2][j].style.display="none" break } } } 最后,这是一个小的 .html 文件,其中所有文件都像这样“粘合”在一起: <html> <!-- xml stacked transposed persons (rows with columns) paged list display data along with some sub-records like 1-n relationship --> <head> <meta charset="UTF-8" name="viewport" content="width=device-width, height=device-height, initial-scale=1.2"/> <title>PeopleList</title> <script src="../frameless-xslt2.min.js"></script> <!-- prhps some other xslt prc --> <script type="text/javascript" src="js/scrpt1.js"></script> <link rel="stylesheet" href="css/stbl.css"/> </head> <body> <h2 style="margin-left:1.6cm">People List</h2> <script type="application/xslt+xml" data-input="xml/prsns.xml" src="xml/prs_style.xsl"></script> </body> </html> 这里还有一小块 .css: span:hover { cursor: pointer; } .cpz1, .cpz2, .cpz3 { display:none; } 所以..这就是全部。 不过有一些注意事项.. 首先,“不幸的是”使用的 xslt 处理器是......frameless.js (frameless.io);这个伟大的旧 xslt 处理器不再可供下载; 他们停止了这一伟大的发展,因此现在使用它会非常困难;选择这个的原因是它的有效性和简单性;不需要事先编译东西,像 saxonJS 那样的东西.. 不要声称是最好的答案,但这是一个可行的解决方案; 这种布局仅适用于没有足够空间的手机 水平展示室,这就是为什么选择垂直方法。 这里的一切实际上都是有效的,即使我没有提供一些可用的工作案例;还有一些涉及.js..并且有点困难;重点是这里描述的一切都正常! 感谢大家观看此内容,并最终希望得到其他回复。

回答 1 投票 0

XSLT - 计算每个员工的不同期间日期值并将所有计数相加得出总数

我什至不确定我是否正确地表达了这个问题。我需要计算 xslt 生成的报告中显示的记录数,并将其显示在包含各种总计的页脚行中...

回答 2 投票 0

XML 未按 XSLT 中的预期形成

我正在使用以下 XSLT 来形成 XML,并且代码工作正常,但我希望将此代码包装在一个条件下。 在下面的 XML 中,因为 S_HL/D_735='T' 只出现一次,这就是我

回答 1 投票 0

更新字符串 XSLT 中的特定位置

我有一个 EDI 文本文件,需要使用 XSLT 进行修改。我首先将文本文件转换为 xml,如下所示: ST^8^347 BAK^00^A^100001396^

回答 1 投票 0

xml 转置事务排序数据在 xslt2 中显示为 html 表

获得以下 xml 简单帐户交易数据(如之前的一些帖子所述): 100 获得以下 xml 简单帐户交易数据(如之前的一些帖子所述): <trnsctns> <trnsctn date="01/01/19"> <OB>100</OB> <amnt/> </trnsctn> <trnsctn date="03/03/19"> <OB/> <amnt>33</amnt> </trnsctn> <trnsctn date="02/02/19"> <OB/> <amnt>22</amnt> </trnsctn> <trnsctn date="05/05/19"> <OB/> <amnt>7</amnt> </trnsctn> <trnsctn date="04/04/19"> <OB/> <amnt>32</amnt> </trnsctn> </trnsctns> 并通过类似于此的 xslt2 转换(取自之前 michael hor 的答案): <xsl:template match="trnsctns"> <table border="1" style="border-collapse:collapse"> <tr><th>crrntNmbr</th> <xsl:for-each select="trnsctn"> <th><xsl:number/></th> </xsl:for-each> </tr> <xsl:call-template name="process"> <xsl:with-param name="transactions" as="element()*"> <xsl:perform-sort select="trnsctn"> <xsl:sort select="replace(@date,'(.{2})/(.{2})/(.{2})','$3$2$1')"/> </xsl:perform-sort> </xsl:with-param> </xsl:call-template> <tr> <th>date</th> <xsl:for-each select="trnsctn"> <td><xsl:value-of select="@date"/></td> </xsl:for-each> </tr> </table> </xsl:template> <xsl:template name="process"> <xsl:param name="transactions"/> <xsl:param name="currentIndex" select="1"/> <tr> <th><xsl:value-of select="name($transactions[1]/*[position() = $currentIndex])"/></th> <xsl:for-each select="$transactions"> <xsl:variable name="currentTransaction" select="."/> <xsl:variable name="currentValue" select="$currentTransaction/*[position() = $currentIndex]"/> <td> <xsl:value-of select="if ($currentValue/text()) then $currentValue else '-'"/> </td> </xsl:for-each> </tr> <xsl:if test="$currentIndex &lt; count($transactions[1]/*)"> <xsl:call-template name="process"> <xsl:with-param name="transactions" select="$transactions"/> <xsl:with-param name="currentIndex" select="$currentIndex + 1"/> </xsl:call-template> </xsl:if> </xsl:template> 我需要像这样显示上面的 xml 数据结构: <table border="1" style="border-collapse:collapse"> <tr><th>crrntNmbr</th><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr> <tr><th>OB</th><td>100</td><td>100</td><td>78</td><td>45</td><td>13</td></tr> <tr><th>amnt</th><td>-</td><td>22</td><td>33</td><td>32</td><td>7</td></tr> <tr><th>CB</th><td>100</td><td>78</td><td>45</td><td>13</td><td>6</td></tr> <tr><th>date</th><td>19/01/01</td><td>19/02/02</td><td>19/03/03</td><td>19/04/01</td><td>19/05/05</td></tr> </table> 将呈现如下: 不过,通过上面展示的 xslt,渲染效果如下: 因此人们很容易注意到缺少一行重要的内容(并且日期根本没有排序): 现在,正如已经说过的(转置的xml交易数据在xslt2中显示为html表格),一些计算字段的逻辑如下(抱歉继续重复..) 从当前记录/节点转置带有列和CB的行是下一个记录或节点的下一个OB 但是一件非常重要的事情,日期(采用以下格式:“dd/mm/yy”)必须按升序排序。然后, 第一列是标题列 第二列实际上是第一个数据行 初始 OB = 100(实际 xml 数据值) amnt = 无或“-” CB = 100 - 0 = 100 第三列(第二数据行) OB = 上一行 CB = 100 上午 = 22 CB = OB - amnt = 100 - 22 = 78 数据=原样(但如上所述正确排序) 第四列(第三数据行) OB = 上一行 CB = 78 上午 = 33 CB = OB - amnt = 78 - 33 = 45 data = 原样(如上所述正确排序) 等等。 就这样吧。 非常抱歉一遍又一遍地问同样的问题,但我非常需要这个 让它起作用。 请你们帮我解决这个问题 谢谢大家的支持和理解 以下是 XSLT 3 代码,它基于 transpose xml transaction data display as html table in xslt2 中发布的答案构建,并添加一个函数将结果表从行转换为列格式(并添加 crrntNmbr 行) );我没有尝试将原始结果中第一个的 date 列移动到最后一行,而是将 crrntNmbr 行之后的第二行: <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mf="http://example.com/mf" exclude-result-prefixes="#all" expand-text="yes"> <xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes"/> <xsl:function name="mf:swap-table" as="element(tr)*"> <xsl:param name="rows" as="element(tr)*"/> <xsl:for-each select="1 to count($rows[1]!*)"> <xsl:variable name="col" select="."/> <tr> <th>{$rows[1]/*[current()]}</th> <xsl:for-each select="2 to count($rows/*[1])"> <td>{$rows[current()]!*[$col]}</td> </xsl:for-each> </tr> </xsl:for-each> </xsl:function> <xsl:template match="/trnsctns"> <xsl:variable name="data-table"> <tr> <th>date</th> <th>ob</th> <th>amnt</th> <th>cb</th> </tr> <xsl:call-template name="process"> <xsl:with-param name="transactions" as="element()*" select="trnsctn => sort((), function($t) { replace($t/@date, '([0-9]{2})/([0-9]{2})/([0-9]{2})', '$3$2$1')})"/> </xsl:call-template> </xsl:variable> <table border="1"> <xsl:sequence select="$data-table"/> </table> <xsl:variable name="swapped-table" select="mf:swap-table($data-table/tr)"/> <table border="1"> <tr> <th>crrntNmbr</th> <xsl:for-each select="1 to count($swapped-table[1]/*) - 1"> <td>{position()}</td> </xsl:for-each> </tr> <xsl:sequence select="$swapped-table"/> </table> </xsl:template> <xsl:template name="process"> <xsl:param name="transactions"/> <xsl:param name="tx" select="$transactions[1]" /> <xsl:param name="ob" select="$tx/OB" /> <xsl:variable name="amnt" select="$tx/amnt" /> <xsl:variable name="amnt" select="if ($amnt/text()) then number($amnt) else 0" /> <xsl:variable name="cb" select="$ob - $amnt" /> <tr> <td> <xsl:value-of select="$tx/@date"/> </td> <td> <xsl:value-of select="$ob"/> </td> <td> <xsl:value-of select="$amnt"/> </td> <td> <xsl:value-of select="$cb"/> </td> </tr> <xsl:if test="count($transactions) > 1"> <xsl:call-template name="process"> <xsl:with-param name="transactions" select="$transactions[position() > 1]"/> <xsl:with-param name="ob" select="$cb"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

如何将 '<p class="p1">' 、 '<div class="disp-quote-p">/following-sibling::*[1][self::p[@class='p1']]' 包装/分组在单个 'p' 元素中

我正在包装节点 ' 、 '' 和 div[@class='disp-quote-p']/following-sibling::*[1][self::p[@class=' p1']] 里面... 我正在尝试将节点 <p class="p1">' , '<div class="disp-quote-p">' and div[@class='disp-quote-p']/following-sibling::*[1][self::p[@class='p1']] 包裹在单个 p 元素中。 输入 XML:- <root> <p class="p">aa</p> <p class="p1">Although:</p> <div class="disp-quote-p"> <p class="p">We had seen.</p> </div> <p class="p1">This dot.</p> <img src="a.png"/> <box>box</box> <p class="p">bb</p> </root> 我正在尝试将节点包装在单个 p 元素中的代码,但此节点 <p class="p1">This dot.</p> 与 <div class="disp-quote-p"> 节点一起包装。 <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="root"> <xsl:copy> <xsl:for-each-group select="*" group-starting-with="p[@class='p1']"> <xsl:for-each-group select="current-group()" group-adjacent="self::p[@class='p1'] or self::div[@class='disp-quote-p']"> <xsl:choose> <xsl:when test="self::p[@class='p1']"> <p><xsl:apply-templates select="node(), current-group() except ."/></p> </xsl:when> <xsl:otherwise> <xsl:copy-of select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:for-each-group> </xsl:copy> </xsl:template> 网址链接:[http://xsltransform.net/eiov64R/1] 预期输出:- <root> <p class="p">aa</p> <p>Although:<disp-quote><p class="p">We had seen.</p></disp-quote>This dot.</p> <img src="a.png"/> <box>box</box> <p class="p">bb</p> </root> 试试这个: <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="root"> <xsl:copy> <xsl:for-each-group select="*" group-adjacent="if(self::p[@class='p1'] or self::div) then -1 else position()"> <xsl:choose> <xsl:when test="self::p[@class='p1'] or self::div"> <p><xsl:apply-templates select="current-group()"/></p> </xsl:when> <xsl:otherwise> <xsl:copy-of select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:copy> </xsl:template> <xsl:template match="p[@class='p1']"> <xsl:apply-templates/> </xsl:template> <xsl:template match="div[@class='disp-quote-p']"> <xsl:element name="disp-quote"> <xsl:apply-templates/> </xsl:element> </xsl:template>

回答 1 投票 0

如何将“block”元素分组到“<p class="p">”元素中?

我想将 元素分组到 元素内部。如果 follow-sibling[1] 是 元素并且 我想将 <block> 元素分组到 <p class="p"> 元素内部。如果 <p class="p"> follow-sibling[1] 是 <block> 元素且 <p class="p1"> 值位于 <p class="p"> 元素中。 输入XML文件-: <root> <p class="p">aaaaaa</p> <block> <p>block</p> </block> <p class="p1"> bbb </p> <block> <p>block</p> </block> <p class="p1">bbb.</p> <p class="p">cccc</p> </root> 我想要下面的预期输出。 输出XML文件: <root> <p class="p">aaaaaa<block><p>block</p></block> bbb <block><p>block</p></block>bbb.</p> <p class="p">cccc</p> </root> 我们能否以另一种方式将逻辑纠正到输出上方,我在输出上方使用 XSLT: <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="p[@class='p']"> <xsl:choose> <xsl:when test="following-sibling::*[1][self::block]"> <xsl:text disable-output-escaping="yes">&lt;p&gt;</xsl:text> <xsl:apply-templates/> </xsl:when> <xsl:otherwise> <p><xsl:apply-templates select="@*|node()"/></p> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="p[@class='p1']"> <xsl:choose> <xsl:when test="following-sibling::*[1][self::p[@class='p']]"> <xsl:apply-templates/> <xsl:text disable-output-escaping="yes">&lt;/p&gt;</xsl:text> </xsl:when> <xsl:otherwise> <xsl:apply-templates/> </xsl:otherwise> </xsl:choose> </xsl:template> 以下内容似乎包装/分组了输入示例的正确节点,但我不确定它是否实现了您的要求,我还不太理解它们。 <xsl:template match="root"> <xsl:copy> <xsl:for-each-group select="*" group-starting-with="p[@class = 'p']"> <xsl:copy> <xsl:apply-templates select="node(), current-group() except ."/> </xsl:copy> </xsl:for-each-group> </xsl:copy> </xsl:template>

回答 1 投票 0

xpath 表达式中返回多个

(我对什么是XQuery,什么是XPath很模糊) 我有一个我想要去的场景(在 XSLT 3.0 语句中的“select”属性中) 为 $x 换成 $xs 对于 $y 中的 $y 返回怪人:foo($x,$y) 我...

回答 1 投票 0

XSLT 条件问题

当 QUALF 为“012”时,我需要传递 BELNR 值。如果 //E1EDK02/[QUALF=012]/BELNR 为 NULL,则复制 //E1EDK02/[QUALF=002]/BELNR 使用以下代码但出现错误 - The context i...

回答 1 投票 0

如何合并从 Apache FOP 创建的 2 个 AFP

如何将使用 apache FOP 创建的大量单独的 AFP 文件合并到单个 AFP 文件中? 也欢迎任何工具建议。

回答 1 投票 0

将计数器/序列号添加到 XSLT 中的 xml 字段

我正在使用以下代码将序列号添加到 /G_HL/S_HL 段,但不起作用。使用以下代码,我可以使用正确的序列填充 D_628,但无法在 co 中填充 D_734...

回答 1 投票 0

如何通过值匹配 xml 属性名称并仅从元素列表中显示该元素

我是 xslt 的新手。我只想显示 xml 列表中匹配的项目。 使用 xslt 转换。 在这种情况下,我只想显示名称为“一”和“二”的属性 那...

回答 1 投票 0

如何循环遍历特定标签并将其逐行显示?

我是 XSLT 的初学者。我正在尝试使用 Apache FOP 创建 AFP 文档。 我有一个像这样的输入 XML: 测试 <...

回答 1 投票 0

2.0 版本的 XSLT 分组

想知道如何在 XSLT 中创建多个分组。以下 XML 应按 memberID、存款日期和存款类型分组。每个成员的总金额应为

回答 1 投票 0

仅在 xslt 中的上下文中搜索关键字

我有一个 xml,其中有多个父节点。需要能够在每个父节点中搜索节点。必须使用 key 作为我的输入(在下面的示例中,jey 语句中的“4”)是派生的

回答 1 投票 0

仅在 xslt 上下文中搜索关键字

我有一个 xml,其中有多个父节点。需要能够在每个父节点中搜索节点。必须使用 key 作为我的输入(在下面的示例中,jey 语句中的“4”)是派生的

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.