0

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

3 回答 3

1

看起来您正在根据属性进行选择,因此您只需要正确捕获 XPath 中的属性。您在文档中使用的引号和 XPath 不需要匹配,因此您可以将它们切换为单引号 ( '):

<xsl:copy-of select="/icestats/source[@mount='/live']/server_description/node()" />

(已编辑以更正属性中/的缺失。)mount

此外,您的原始文档不是有效的 XML,因为 XML 不允许结束标记中的属性。

于 2013-07-22T23:44:58.787 回答
1

在您的处理器产生您正在寻找的输出之前,您需要解决几个问题。

1) 您的 XML 输入必须格式正确。元素的结束标签source不应包含mount在开始标签上指定的属性。

<source mount="/live">
   ...
</source>

xsl:copy-of2)必须使元素上的 XPath有效。XPath 表达式的语法(幸运的是)与 XML 元素和属性的语法不同。通过预测属性值来指定source要匹配的元素,就像您所做的那样,除了您需要使用方括号:

/icestats/source[@mount="/live"]/server_description

为了在 XSLTselect语句中使用这个 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。)

于 2013-07-22T23:58:29.277 回答
0

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

<xsl:copy-of select="/icestats/source mount=&quot;/live&quot;/server_description/node()" />
于 2013-07-22T23:38:48.503 回答