如何在xslt中基于元素重复检索行号?
输入的格式如下:如何在xslt中基于元素重复检索行号?,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,输入的格式如下: <imageLink> <url colNumber="1">aa</url> <imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode> <languageCode colNumber="3">en</languageCode> <languageCode colNumber="3">fr&l
<imageLink>
<url colNumber="1">aa</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">en</languageCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
<imageLink>
<url colNumber="1">bb</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
aa
产品形象
EN
fr
bb
产品形象
fr
输出格式如下:
<imageLink rowNum="1">
<url rowNum="1" colNumber="1">aa</url>
<imageTypeCode rowNum="1" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="1" colNumber="3">en</languageCode>
<languageCode rowNum="2" colNumber="3">en1</languageCode>
</imageLink>
<imageLink rowNum="3">
<url rowNum="3" colNumber="1">bb</url>
<imageTypeCode rowNum="3" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="3" colNumber="3">fr</languageCode>
</imageLink>
aa
产品形象
EN
en1
bb
产品形象
fr
然后将此输出进一步添加到Excel格式。如何准确地检索输出格式中显示的行号
我认为一种方法是计算第一个
imageLink
及其子级的属性rowNum
,然后取最大值+1作为下一个同级的起始值:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="*[1]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*">
<xsl:param name="row" select="1"/>
<xsl:variable name="copy" as="element()">
<xsl:copy>
<xsl:attribute name="rowNum" select="$row"/>
<xsl:apply-templates>
<xsl:with-param name="row" select="$row"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:variable>
<xsl:copy-of select="$copy"/>
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="row" select="max($copy/*/@rowNum) + 1"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="root/*/*">
<xsl:param name="row"/>
<xsl:copy>
<xsl:variable name="index" as="xs:integer">
<xsl:number/>
</xsl:variable>
<xsl:attribute name="rowNum" select="$row - 1 + $index"/>
<xsl:copy-of select="@*, node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
转变
<root>
<imageLink>
<url colNumber="1">aa</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">en</languageCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
<imageLink>
<url colNumber="1">bb</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
</root>
aa
产品形象
EN
fr
bb
产品形象
fr
进入
aa
产品形象
EN
fr
bb
产品形象
fr
是的,这与您所说的完全一样,但我尝试将其用于以下过程,但它不起作用:请编辑您的问题,显示并解释输入有多复杂,以及您想要的新样本结果。这是在export的第23行第59列的xsl:apply templates/@select中的表达式{./*[not()]}中的字符5处抛出errorStatic error。xsl:XPST0017:System function not()不能用零参数调用{root/*/}中字符8处的Static error在export第34行第36列的xsl:template/@match中的模式中。xsl:XTSE0340:在样式表编译期间报告了表达式开头的意外标记“”错误。如果您可以有子元素而不仅仅是子元素,则将..
更改为..
和xsl:template match=“root/*/*”
到xsl:template match=“root/*//”
。
<root>
<imageLink rowNum="1">
<url rowNum="1" colNumber="1">aa</url>
<imageTypeCode rowNum="1" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="1" colNumber="3">en</languageCode>
<languageCode rowNum="2" colNumber="3">fr</languageCode>
</imageLink>
<imageLink rowNum="3">
<url rowNum="3" colNumber="1">bb</url>
<imageTypeCode rowNum="3" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="3" colNumber="3">fr</languageCode>
</imageLink>
</root>