使用 XSLT 提取 cdata 标签内的文本

Extract text inside cdata tag using XSLT

我有以下 XML 和我想从中提取文本的 cdata 标签?

<?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 也没有相同的前缀或命名空间,它更改

这并不是 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>