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