逃离双引号,空间并允许额外的前进斜线

时间:2013-07-22 23:34:54

标签: xslt

我有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>

3 个答案:

答案 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)

我认为您需要做的就是使用&quot;转义属性字符串中的引号:

<xsl:copy-of select="/icestats/source mount=&quot;/live&quot;/server_description/node()" />