首页 > 解决方案 > 如何使用 match 属性获取具有特定名称的所有节点

问题描述

我正在尝试通过以下方式使用 match 属性在 XML 文件中获取一组节点 -

<xsl:template match="//title" name="split">

它似乎不起作用。

这是我正在尝试使用的 XML 文件(取自https://www.w3schools.com/xml/xpath_syntax.asp

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="c.xsl"?>

<bookstore>
    <book>
        <title lang="en">Harry Potter</title>
        <price>29.99</price>
    </book>

    <book>
        <title lang="en">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>

这是我要运行的 xsl 文件

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="//title" name="split">
    <xsl:value-of select=".">
    </xsl:value-of>
 </xsl:template>
</xsl:stylesheet>

所需的输出是:哈利波特学习 XML

标签: xmlxsltxpath

解决方案


您有一个正确匹配标题的模板,但您没有任何东西可以捕捉和忽略其他所有内容,因此将包含所有文本内容。

加入一个匹配所有模板,它只是将样式表重新应用于其他所有内容。请注意,如果您这样做,则不需要通配符//title匹配,只需匹配元素名称即可。

XSL

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />

    <xsl:template match="title" name="split">
        <xsl:value-of select="concat(., ' ')" />
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:apply-templates select="@*|node()" />
    </xsl:template>

</xsl:stylesheet>

输出

Harry Potter Learning XML 

推荐阅读