获取当前节点号的XSLT / XPath

时间:2013-01-13 17:59:10

标签: xml xslt xpath

我有以下xml数据结构要转换:

 <root>
    <main1>
            <text-body>
                <title>A</title>
                <subtitle>A</subtitle>
            </text-body>
    <!-- other stuff -->
            <text-body>
                <titel>Aa</titel>
                <subtitel>Aa</subtitel>
            </text-body>
    <!-- other stuff -->
            <text-body>
                <titel>Aaa</titel>
                <subtitel>Aaa</subtitel>
            </text-body>
    </main1>
    <main2>
        <text-body>
            <title>B</title>
            <subtitle>B</subtitle>
            <body>B</body>
        </text-body>
        <text-body>
            <title>C</title>
            <subtitle>C</subtitle>
            <body>C</body>
        </text-body>
        <text-body>
            <title>D</title>
            <subtitle>D</subtitle>
            <body>D</body>
        </text-body>
    </main2>
    </root>

我需要将main / text-body中的数据替换为main2 / text-body中的数据,但保留main1中的其他内容。输出应如下所示:

<root>
        <main1>
              <text-body>
                <title>B</title>
                <subtitle>B</subtitle>
                <body>B</body>
                </text-body>
        <!-- other stuff -->
              <text-body>
                 <title>C</title>
                <subtitle>C</subtitle>
                <body>C</body>
              </text-body>
        <!-- other stuff -->
              <text-body>
                <title>D</title>
                <subtitle>D</subtitle>
                <body>D</body>
              </text-body>
        </main1>
        <main2>
            <text-body>
                <title>B</title>
                <subtitle>B</subtitle>
                <body>B</body>
            </text-body>
            <text-body>
                <title>C</title>
                <subtitle>C</subtitle>
                <body>C</body>
            </text-body>
            <text-body>
                <title>D</title>
                <subtitle>D</subtitle>
                <body>D</body>
            </text-body>
        </main2>
        </root>

我有以下xsl代码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml"/>

   <xsl:template match="@*|node()">
    <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
   </xsl:template>

    <xsl:template match="main1/text-body">
           <xsl:param name="count" select="count(preceding-sibling::node())"/>
           <xsl:copy-of select="/root/main2/text-body[$count]"/>
    </xsl:template>

</xsl:stylesheet>

我尝试获取main1 / text-body的当前节点索引以填充main2的右侧文本正文。但它不起作用。这是当前的输出:

<?xml version="1.0" encoding="UTF-8"?><root>
        <main1>
              <text-body>
                <title>B</title>
                <subtitle>B</subtitle>
                <body>B</body>
            </text-body>
        <!-- other stuff -->

        <!-- other stuff -->

        </main1>
        <main2>
            <text-body>
                <title>B</title>
                <subtitle>B</subtitle>
                <body>B</body>
            </text-body>
            <text-body>
                <title>C</title>
                <subtitle>C</subtitle>
                <body>C</body>
            </text-body>
            <text-body>
                <title>D</title>
                <subtitle>D</subtitle>
                <body>D</body>
            </text-body>
        </main2>
        </root>

请帮忙!

1 个答案:

答案 0 :(得分:5)

XPath和XSLT是基于1的索引。为了选择第一项,您的谓词过滤器会查找[1],而不是[0]

鉴于此,变量$count需要将1添加到前一兄弟选择的count()。此外,您应该计算前兄弟姐妹的text-body元素,而不是全部/任何node()

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="main1/text-body">
        <xsl:param name="count" select="count(preceding-sibling::text-body)+1"/>
        <xsl:copy-of select="/root/main2/text-body[$count]"/>
    </xsl:template>

</xsl:stylesheet>