如何根据xslt中的元素重复检索行号?

时间:2017-01-11 11:01:16

标签: 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</languageCode>
</imageLink>
<imageLink>
    <url colNumber="1">bb</url>
    <imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
    <languageCode colNumber="3">fr</languageCode>
</imageLink>

输出格式如下:

<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>         

然后将此输出添加到Excel格式。如何完全按照输出格式检索行号?

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为一种方法是为第一个rowNum及其子项计算属性imageLink,然后将最大值+ 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>

<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>