我想选择所有子标记的值只能删除一个或多个标记

时间:2015-10-30 11:16:01

标签: xml xslt xslt-1.0

我有以下xml:

    <?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
</catalog>

要解决此查询的XSLT是:

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

<xsl:template match="/">
  <html>
  <body>
        <xsl:value-of select="catalog/cd"/> 
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

我在上面写了xslt代码,它正在挑选所有子标签的所有值。上述代码的答案将是:

  

Empire Burlesque Bob Dylan USA Columbia 10.90 1985

问题:我想要选择除了一个以外的所有子标签,让我们说我不想从子标签“价格”中获取价值。即我期待以下回答

  

Empire Burlesque Bob Dylan USA Columbia 1985

这个答案的“xslt 1.0”代码是什么?

1 个答案:

答案 0 :(得分:2)

首先,您应该知道现有XSLT的实际输出是:

<html>
   <body>
           Empire Burlesque
              Bob Dylan
              USA
              Columbia
              10.90
              1985

   </body>
</html>

您展示的是浏览器如何渲染到屏幕上(所有空白字符序列都折叠到一个空格)。

要从结果中排除价格,您必须使样式表更深入一层 - 并提供您自己的分隔符。

替换:

 <xsl:value-of select="catalog/cd"/> 

使用:

<xsl:for-each select="catalog/cd/*[not(self::price)]">
    <xsl:value-of select="."/>
    <xsl:text> </xsl:text>
</xsl:for-each>

此处的结果将是:

<html>
   <body>Empire Burlesque Bob Dylan USA Columbia 1985 </body>
</html>

浏览器将呈现为:

Empire Burlesque Bob Dylan USA Columbia 1985