xsl文件中的空节点

时间:2014-03-05 14:53:21

标签: xml xslt xslt-1.0

我正在尝试使用XSLT转换XML。但整个节点FKN-VERS为空。可以任何人建议请.. 我的xml代码是:

<?xml version="1.0" encoding="UTF-8"?>
<Versions>
  <FirstVersion >
    <Element OriginalName="fin_Test" >
      <ElementClass Name="TEST"/>
      <ElementAttributes/>
    </Element>
    <Type Name="TEST" />
    <LifecycleState Name="OPe" Lifecycle="STANDARD" />
    <Predecessors>
      <Predecessor Variant="BASE_RETEST1" Revision="1"/>
    </Predecessors>

  </FirstVersion>
</Versions>

我的xsl转换代码是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/Versions[FirstVersion/Type/@Name='TEST']">
    <DATA>
      <xsl:attribute name="ID">10</xsl:attribute>
      <FKN-VERS>
        <FKN-VERS>
          <xsl:for-each select="  Versions/FirstVersion/Predecessors">
            <VERS-LABEL>
              <xsl:value-of select="concat(@Variant, ';',@Revision)"/>
            </VERS-LABEL>
          </xsl:for-each>
        </FKN-VERS>
      </FKN-VERS>
    </DATA>
  </xsl:template>
</xsl:stylesheet>

输出:

<ID="10">
  <FKN-VERS>
    <FKN-VERS/>
  </FKN-VERS>
</DATA>

2 个答案:

答案 0 :(得分:1)

更改for-each声明,

<xsl:for-each select="  Versions/FirstVersion/Predecessors">

<xsl:for-each select="FirstVersion/Predecessors/Predecessor">

因为当包含的模板匹配时,当前节点已经位于Versions元素,并且您希望迭代Predecessor元素,而不是包含Predecessors元素。

答案 1 :(得分:1)

在我看来,你的选择路径开始一个节点太高,并且结束一个节点太高。试试这个:

<xsl:for-each select="FirstVersion/Predecessors/Predecessor">
   <VERS-LABEL>
       <xsl:value-of select="concat(@Variant, ';',@Revision)"/>
   </VERS-LABEL>
</xsl:for-each>