【问题标题】:Extract text inside cdata tag using XSLT使用 XSLT 提取 cdata 标记内的文本
【发布时间】:2016-12-12 16:45:10
【问题描述】:

我有以下带有 cdata 标记的 XML,我想从中提取文本?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cus:TestData xmlns:cus="http://test.namespace.com/data">
<![CDATA[testValue]]></cus:TestData >

如何在 XSLT 中实现这一点?

我正在短暂尝试以下内容

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        "<xsl:value-of select="/*/Name"/>"
    </xsl:template>
</xsl:stylesheet>

但它似乎不起作用

此外,XML 也没有相同的前缀或命名空间,它会发生变化

【问题讨论】:

    标签: xslt cdata


    【解决方案1】:

    这不是 CData 的真正问题。您的 XSLT 当前正在根元素下查找名为 Name 的元素,该元素在您的 XML 中不存在。如果您的 XML 源是您实际使用的源,您可以这样做...

    <xsl:value-of select="/*"/>
    

    但是假设你的 XML 看起来像这样......

    <cus:TestData xmlns:cus="http://test.namespace.com/data">
       <cus:Name><![CDATA[testValue]]></cus:Name>
    </cus:TestData>
    

    然后,您需要考虑 XSLT 中的命名空间,因为 Name 在 XML 中的命名空间中,但您的 XSLT 当前正在寻找没有命名空间中的 Name 元素。

    这样的事情会做:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:c="http://test.namespace.com/data">
        <xsl:output method="text"/>
        <xsl:template match="/">
          "<xsl:value-of select="/*/c:Name"/>"
        </xsl:template>
    </xsl:stylesheet>
    

    注意,前缀不需要匹配,但命名空间 URI 需要匹配。

    如果命名空间 URI 实际上可能会有所不同,您可以改为这样做......

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text"/>
        <xsl:template match="/">
          "<xsl:value-of select="/*/*[local-name() = 'Name']"/>"
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 我在xslttest.appspot.com 上尝试了您的最后一个解决方案,但我只得到一个空白字符串而不是 CDATA 标记内的值?
    • 抱歉我忘记更新节点了。这是有效的。非常感谢
    • 无论如何我可以让这个总是在 xml 标签之后取他的第一个节点?
    • 如果您的意思是 &lt;?xml 声明,那么第一个解决方案 &lt;xsl:value-of select="/*"/&gt; 会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2017-12-26
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多