【问题标题】:XSL printing just the first occurrence of selected nodeXSL 仅打印所选节点的第一次出现
【发布时间】:2013-05-23 18:08:38
【问题描述】:

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

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    value-of 元素的select 属性与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>
    

    【讨论】:

      【解决方案2】:

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

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

      <html>Hydrogen Helium</html>
      

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多