xml - 如何使用 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
解决方案
您有一个正确匹配标题的模板,但您没有任何东西可以捕捉和忽略其他所有内容,因此将包含所有文本内容。
加入一个匹配所有模板,它只是将样式表重新应用于其他所有内容。请注意,如果您这样做,则不需要通配符//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
推荐阅读
- c# - 我的 IntelliSense 没有显示任何自动填充,即使代码仍然有效
- windows - SetWindowPos 如何影响所有者窗口的 Z 顺序?
- javascript - 如果 array2 不具有相同的对象键值,则从对象数组 (array1) 中删除对象
- python - 用while在几个线程中运行Python函数
- angular - 基于公共布尔数组的 Ionic Auth Gaurd canLoad
- apache-spark - 根据 pyspark 中的条件聚合值
- firebase - 在 Flutter 中的多个 Firebase 项目/环境之间切换?
- python - 从 Spyder 导入 wxpython 时出现 ImportError
- python - 将带有负数的列表作为字符串排序会产生意外的结果
- mysql - 如何用regexp_replace在mysql中用特定字符替换多个字符?