2013-01-13 67 views
2

我對XML數據的結構如下改造:XSLT/XPath的獲取當前節點編號

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

,我需要更換MAIN2 /文本的主/文本的身體隨着數據的數據身體,但保持其他東西在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 /文體的當前節點指數填寫正確的文本 - 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> 

請幫忙!

回答

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

非常感謝您! –

+0

對於正確的答案+1。 –