XSL打印只是第一次出现所选节点

时间:2013-05-23 18:08:38

标签: xml xslt

我有以下XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet media="netscape" type="text/xsl" href="periodic.xsl"?>
<PERIODIC_TABLE>
  <ATOM STATE="GAS">
    <NAME>Hydrogen</NAME>
    <SYMBOL>H</SYMBOL>
    <ATOMIC_NUMBER>1</ATOMIC_NUMBER>
    <ATOMIC_WEIGHT>1.00794</ATOMIC_WEIGHT>
    <BOILING_POINT UNITS="Kelvin">20.28</BOILING_POINT>
    <MELTING_POINT UNITS="Kelvin">13.81</MELTING_POINT>
    <DENSITY UNITS="grams/cubic centimeter">
    <!-- At 300K, 1 atm -->0.0000899
    </DENSITY>
  </ATOM>
  <ATOM STATE="GAS">
    <NAME>Helium</NAME>
    <SYMBOL>He</SYMBOL>
    <ATOMIC_NUMBER>2</ATOMIC_NUMBER>
    <ATOMIC_WEIGHT>4.0026</ATOMIC_WEIGHT>
    <BOILING_POINT UNITS="Kelvin">4.216</BOILING_POINT>
    <MELTING_POINT UNITS="Kelvin">0.95</MELTING_POINT>
    <DENSITY UNITS="grams/cubic centimeter">
    <!-- At 300K -->0.0001785
    </DENSITY>
  </ATOM>
</PERIODIC_TABLE>

我试图用这个XSL代码打印“NAME”的所有值:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html> 
            <xsl:value-of select="//ATOM/NAME" />
        </html>
    </xsl:template>
</xsl:stylesheet>

但输出是:

<html>Hydrogen</html>

虽然也应该有“氦气”。我知道还有其他方法可以做到这一点,例如在xml:template match属性中选择“NAME”,但我需要知道这种行为的原因,所以我可以学习如何使用value-of。

2 个答案:

答案 0 :(得分:4)

select元素的value-of属性与XPath string() function的工作方式相同,后者将其参数转换为字符串。文档说明了这个

  

通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。

所以你传递了一组两个NAME节点,而select只使用了第一个节点。

您可以使用for-each元素,但XSLT最好用模板编写。这将按照你的要求行事。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <html> 
      <xsl:apply-templates select="PERIODIC_TABLE/ATOM/NAME"/>
    </html>
  </xsl:template>

  <xsl:template match="NAME">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<html>HydrogenHelium</html>

答案 1 :(得分:1)

除了Borodin的回答,XSLT 2.0中的行为也不同。在XSLT 2.0中,xsl:value-of指令创建了一个序列。

只需将版本号更改为2.0并使用2.0处理器,即可获得以下输出:

<html>Hydrogen Helium</html>