1

我有以下 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。

4

2 回答 2

4

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

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

所以你正在传递一组两个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>
于 2013-05-23T18:31:28.610 回答
1

In addition to Borodin's answer, the behavior is different in XSLT 2.0. In XSLT 2.0, the xsl:value-of instruction creates a sequence.

By just changing the version number to 2.0 and using a 2.0 processor, you get the following output:

<html>Hydrogen Helium</html>
于 2013-05-24T00:28:57.307 回答