每个循环的XSLT条件都不会提取所有值

时间:2014-07-04 13:33:54

标签: xml xslt

我有XML文件,看起来像" ROL"节点可以是0到n

<Message>
<ROL>
    <ROL.1>
        <ROL.1.1>1</ROL.1.1>
    </ROL.1>
    <ROL.2>
        <ROL.2.1>AD</ROL.2.1>
    </ROL.2>
    <ROL.3>
        <ROL.3.1>FH</ROL.3.1>
    </ROL.3>
    <ROL.4>
        <ROL.4.1>A</ROL.4.1>
        <ROL.4.2>B</ROL.4.2>
        <ROL.4.3>C</ROL.4.3>
        <ROL.4.4>D</ROL.4.4>
</ROL>
<ROL>
    <ROL.1>
        <ROL.1.1>1</ROL.1.1>
    </ROL.1>
    <ROL.2>
        <ROL.2.1>AD</ROL.2.1>
    </ROL.2>
    <ROL.3>
        <ROL.3.1>PP</ROL.3.1>
    </ROL.3>
    <ROL.4>
        <ROL.4.1>W</ROL.4.1>
        <ROL.4.2>X</ROL.4.2>
        <ROL.4.3>Y</ROL.4.3>
        <ROL.4.4>Z</ROL.4.4>
</ROL>
</Message>

我的XSLT看起来像这样:

<xsl:for-each select="//Message/ROL">
  <xsl:for-each select="ROL.3/ROL.3.1">
        <aa> <xsl:value-of select="."/> </aa>
        <xsl:choose>
             <xsl:when test=".='FH'">
                <Family>
                  <xsl:attribute name="FHFrist"> <xsl:value-of     select="//ROL.4/ROL.4.3"/>  </xsl:attribute>
                  <xsl:attribute name="FHLast"> <xsl:value-of select="//ROL.4/ROL.4.2"/> </xsl:attribute>
                </Family>
            </xsl:when>
            <xsl:when test=".='PP'">
                <Primary>
                  <xsl:attribute name="FHFrist"> <xsl:value-of select="//ROL.4/ROL.4.3"/>  </xsl:attribute>
                  <xsl:attribute name="FHLast"> <xsl:value-of select="//ROL.4/ROL.4.2"/> </xsl:attribute>
                </Primary>
            </xsl:when>
        </xsl:choose>   
 </xsl:for-each>
</xsl:for-each>

结果我得到了:

<aa>FH</aa>
<Family FHFrist="C" FHLast="B"/>
<aa>PP</aa>
<Primary FHFrist="C" FHLast="B"/>

期望的结果:

<aa>FH</aa>
<Family FHFrist="C" FHLast="B"/>
<aa>PP</aa>
<Primary FHFrist="Y" FHLast="X"/>

我的问题是XSLT无法根据这个条件提取ROL.4.3和ROL.4.2的值 -             当测试=&#34;。=&#39; FH&#39;             当测试=&#34;。=&#39; PP&#39; 看来它正在提取第一个实例的价值,为什么?我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:0)

在XPath //开始从文件的开头搜索。

e.g。这将使你从ROL.3.1到ROL.4.3

./../../ROL.4/ROL.4.3

您想要的结果将包括从一个ROL元素导航到另一个ROL元素。

我的假设是你会留在单个ROL的背景下,因此我认为需要以下结果?

<aa>FHCP</aa>
<Family FHFrist="C" FHLast="B"/>
<aa>PP</aa>
<Primary FHFrist="Y" FHLast="X"/>

基于以上结果......

<xsl:for-each select="//Message/ROL">
  <xsl:for-each select="ROL.3/ROL.3.1">
    <aa>
      <xsl:value-of select="." />
    </aa>
    <xsl:choose>
      <xsl:when test=".='FH'">
        <Family>
          <xsl:attribute name="FHFrist">
            <xsl:value-of select="./../../ROL.4/ROL.4.3" />
          </xsl:attribute>
          <xsl:attribute name="FHLast">
            <xsl:value-of select="./../../ROL.4/ROL.4.2" />
          </xsl:attribute>
        </Family>
      </xsl:when>
      <xsl:when test=".='PP'">
        <Primary>
          <xsl:attribute name="FHFrist">
            <xsl:value-of select="./../../ROL.4/ROL.4.3" />
          </xsl:attribute>
          <xsl:attribute name="FHLast">
            <xsl:value-of select="./../../ROL.4/ROL.4.2" />
          </xsl:attribute>
        </Primary>
      </xsl:when>
    </xsl:choose>   
  </xsl:for-each>
</xsl:for-each>