我有XML
<?xml version="1.0" encoding="UTF-8"?>
<icestats>
<stats_connections>0</stats_connections>
<source mount="/live">
<bitrate>Some data</bitrate>
<server_description>This is what I want to return</server_description>
</source>
</icestats>
我有XSL
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:copy-of select="/icestats/source mount="/live"/server_description/node()" />
</xsl:template>
</xsl:stylesheet>
我想要输出
This is what I want to return
如果我从源代码中删除双引号,空格和正斜杠,但是我无法使用其他帖子中的建议方法成功转义非标准字符。
为清楚起见,以下是Lego Stormtroopr的解决方案
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:copy-of select="/icestats/source[@mount='/live']/server_description/node()" />
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
看起来你正在根据属性进行选择,所以你只需要在XPath中正确捕获属性。您在文档中使用的引号和XPath不需要匹配,因此您可以将它们切换为单引号('
):
<xsl:copy-of select="/icestats/source[@mount='/live']/server_description/node()" />
(已修改以更正/
属性中缺少的mount
。)
此外,您的原始文档不是有效的XML,因为XML不允许在结束标记中使用属性。
答案 1 :(得分:1)
在您的处理器生成您正在寻找的输出之前,您需要解决几个问题。
1)您的XML输入必须格式良好。 source
元素的结束标记不应包含在开始标记上指定的mount
属性。
<source mount="/live">
...
</source>
2)xsl:copy-of
元素上的XPath必须有效。 (幸运的是)XPath表达式的语法与XML元素和属性的语法不同。通过预测属性值来指定要匹配的source
元素,就像您所做的那样,除了您需要使用方括号:
/icestats/source[@mount="/live"]/server_description
为了在XSLT select
语句中使用此XPath表达式,您需要确保用一种类型的引号将整个select
属性值括起来,并使用另一种类型的属性值中的引号,例如:
<xsl:value-of select="/icestats/source[@mount='/live']/server_description" />
使用此输入
<?xml version="1.0" encoding="UTF-8"?>
<icestats>
<stats_connections>0</stats_connections>
<source mount="/live">
<bitrate>Some data</bitrate>
<server_description>This is what I want to return</server_description>
</source>
</icestats>
和这个样式表
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="/icestats/source[@mount='/live']/server_description" />
</xsl:template>
</xsl:stylesheet>
我从xsltproc和saxon获得以下文本行:
This is what I want to return
xsl:value-of
元素将返回元素的字符串值(此处为一个文本节点)。如果你真的想要server_description
元素,那么你可以使用xsl:copy-of
来获取整个事物,标签和所有内容。 (您还必须更新xsl:output
。)
答案 2 :(得分:0)
我认为您需要做的就是使用"
转义属性字符串中的引号:
<xsl:copy-of select="/icestats/source mount="/live"/server_description/node()" />