2015-04-23 66 views
0

我需要從分層XML文本中構建一個平面表。我需要每個meas節點有一條扁平線。每個meas節點都有一個索引號(mN),它指向一個較小的部分,其中標籤(tL)保留索引號的每個唯一可能性。我想循環每個meas節點並使用值mN屬性來查找相應的tL值。下面的例子正確交付指數(mN)號碼,但始終提供One的每一行:通過變量索引號引用節點

XML

<root> 
    <cond tN="1" tL="One"/> 
    <cond tN="2" tL="Two"/> 
    <cond tN="3" tL="Three"/> 
    <cond tN="4" tL="Four"/> 
    <cond tN="5" tL="Five"/> 
    <meas mN="1"/> 
    <meas mN="2"/> 
    <meas mN="3"/> 
    <meas mN="4"/> 
    <meas mN="5"/> 
    <meas mN="1"/> 
    <meas mN="2"/> 
    <meas mN="3"/> 
    <meas mN="4"/> 
    <meas mN="5"/> 
</root> 

XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="/root/meas"> 
      <xsl:variable name="MeasN"> 
       <xsl:value-of select="@mN"/> 
      </xsl:variable> 
      <xsl:value-of select="$MeasN"/>, 
      <xsl:value-of select="../cond[$MeasN]/@tL"/>. 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

輸出

1 One 
2 One 
3 One 
4 One 
5 One 
1 One 
2 One 
3 One 
4 One 
5 One 

回答

1

MeasN包含字符串,這意味着你的表達cond[$MeasN]會發現所有cond元素,你的字符串非空(即所有的人)。但是,xsl:value-of將只輸出第一個。

你可能需要做

<xsl:value-of select="../cond[number($MeasN)]/@tL"/> 

或者,也許,你應該,你應該檢查tN屬性呢? (這無論工作cond元素

<xsl:value-of select="../cond[@tN = $MeasN]/@tL"/> 

在檢查tL屬性的情況下的順序,而不是位置,你也可以一鍵實現呢?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="text"/> 
    <xsl:key name="cond" match="cond" use="@tN" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/root/meas"> 
      <xsl:variable name="MeasN" select="@mN"/> 
      <xsl:value-of select="$MeasN"/>, 
      <xsl:value-of select="key('cond', $MeasN)/@tL"/>. 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Tim C,非常感謝你!所有的建議都是合適的,並且給我足夠的工作和學習機會,並感謝簡化我的xsl:變量。 – KnomDeGuerre