2012-08-16 72 views
1

我想寫點東西另一個個人和IM停留在樣式表的最後部分的價值。多文檔XSLT,與另外失常

我們有兩個XML文檔:

TestXML.xml:

<rootNode> 
    <header> 
    <title agg="sum">1</title> 
    <records agg="sum">10</records> 
    <number agg="min">5</number> 
    </header> 
</rootNode> 

和TestXMLTwo.xml:

<rootNode> 
    <header> 
    <title agg="sum">2</title> 
    <records agg="sum">20</records> 
    <number agg="min">15</number> 
    </header> 
</rootNode> 

哪裏,如果節點有agg屬性等於 '和'我們結合兩個文檔節點的值。然而就行<xsl:value-of select=". + $tempElementDocTwo"/>

<xsl:param name="InputFileOne">[EditedOut]\TestXML.xml</xsl:param> 
<xsl:param name="InputFileTwo">[EditedOut]\TestXMLTwo.xml</xsl:param> 

<xsl:template match="node()|@*"> 
    <xsl:call-template name="ConcatFiles"/> 
</xsl:template> 

<xsl:template name="ConcatFiles"> 
    <xsl:variable name="tempStoreDocOne" select ="document($InputFileOne)/rootNode/header" /> 
    <xsl:variable name="tempStoreDocTwo" select ="document($InputFileTwo)/rootNode/header" /> 

<xsl:element name="rootNode"> 
    <xsl:element name="header"> 

    <xsl:for-each select="$tempStoreDocOne/node()"> 
     <xsl:choose> 

     <xsl:when test="./@agg = 'sum'"> 
      <xsl:variable name="tempElementDocTwo" select ="$tempStoreDocTwo/."/> 
      <xsl:element name="{name(.)}"> 
      <xsl:value-of select=". + $tempElementDocTwo"/> 
      </xsl:element> 
     </xsl:when> 

     <xsl:otherwise> 
      <xsl:element name="{name(.)}"> 
      <xsl:value-of select="."/> 
      </xsl:element> 
     </xsl:otherwise> 

     </xsl:choose> 
    </xsl:for-each> 

    </xsl:element> 
</xsl:element> 
</xsl:template> 

我只是得到了<title>和22025爲<records>一個的「22016」值:我使用這樣做。有人能告訴我我要去哪裏嗎?

回答

3

變化<xsl:for-each select="$tempStoreDocOne/node()"><xsl:for-each select="$tempStoreDocOne/*">,然後添加一個變量存儲位置,即

<xsl:variable name="pos" select="position()"/> 

for-each裏面,然後換

 <xsl:variable name="tempElementDocTwo" select ="$tempStoreDocTwo/."/> 

 <xsl:variable name="tempElementDocTwo" select ="$tempStoreDocTwo/*[$pos]"/> 

當前訪問comp的字符串值在第二個文檔中,它是其後代節點的連接,而您想要訪問與第一個文檔中的位置相同的子元素。

+0

完美,謝謝你馬丁。 – Mike 2012-08-16 10:27:05

1

這裏是一個更簡單和更短的解決方案(沒有明確的條件語句):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pDoc2"> 
    <rootNode> 
     <header> 
      <title agg="sum">2</title> 
      <records agg="sum">20</records> 
      <number agg="min">15</number> 
     </header> 
    </rootNode> 
</xsl:param> 

<xsl:variable name="vDoc2" select="document('')/*/xsl:param"/> 

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

<xsl:template match="header/*[@agg='sum']"> 
    <title> 
    <xsl:value-of select= 
    ". + $vDoc2/*/header/*[name()=name(current()) and @agg='sum']"/> 
    </title> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是第一個XML文檔(第二個是在轉型只是爲了方便,內聯應用):

<rootNode> 
    <header> 
     <title agg="sum">1</title> 
     <records agg="sum">10</records> 
     <number agg="min">5</number> 
    </header> 
</rootNode> 

有用,正確的結果產生

<rootNode> 
    <header> 
     <title>3</title> 
     <title>30</title> 
     <number agg="min">5</number> 
    </header> 
</rootNode> 
+0

謝謝Dimitre,不知道你可以做那裏使用的一些功能,很好的學習:) – Mike 2012-08-16 13:09:28

+0

@Mike,不客氣。 – 2012-08-16 13:21:48