当前位置: 首页 > 知识库问答 >
问题:

用XSLT1.0解析CDATA值

穆城
2023-03-14

我想使用xslt转换一些xml文件,但遇到了一个大问题。

在我的输入文件中,我有CDATA标记,它包含xml子树-S,应该复制到输出标记中。我们知道关于这些CDATA标记的一些信息:

<ns1:myOperation xmlns:ns1="http://mynamespace/">
    <SUBXML1>
        <![CDATA[<metaData><value>value1</value></metaData><metaData><value>value2</value></metaData><notMetaData><notValue>value3</notValue></notMetaData>]]>
    </SUBXML1>
</ns1:myOperation>

我的xsl如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://mynamespace/">
    <xsl:output method="xml" version="1.0" encoding="UTF-8"
        indent="yes" omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:apply-templates select="ns1:myOperation" />
    </xsl:template>

    <xsl:template match="ns1:myOperation">
        <ns1:myOperation>
            <xsl:apply-templates select="SUBXML1" />
        </ns1:myOperation>
    </xsl:template>

    <xsl:template match="SUBXML1">
        <xsl:element name="one">
            <xsl:element name="metaData">
                <xsl:value-of
                    select="substring-before(substring-after(.,'metaData&gt;'), '&lt;/metaData')" disable-output-escaping="yes" />
            </xsl:element>
        </xsl:element>
        <xsl:element name="all">
            <xsl:element name="allSUBXML1">
                <xsl:value-of
                    select="." disable-output-escaping="yes" />
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

这样做的输出将是:

<ns1:myOperation xmlns:ns1="http://mynamespace/">
    <one>
        <metaData>
            <value>value1</value>
        </metaData>
    </one>
    <all>
        <allSUBXML1 />
    </all>
</ns1:myOperation>

注意:如果您在eclipse中测试这个示例,它可以工作( 不会为空),但是xsl:value-of select应该只在元素中工作!因此,在message broker中,它将生成emtpy 元素,但在eclipse中不知何故(可能是bug?)它将生成一个“完整输出”,因此,它将使用SUBXML1内容填充该字段。

谢谢你,塔马斯

共有1个答案

高锦
2023-03-14

您对使用XSLT是死心塌地的吗?我认为,您可以使用ESQL中的parse as bitstream子句轻松地完成这一任务。

 类似资料:
  • 当前输出: 所需的输出是(将提取的内容从CDATA中取出): 我也尝试了“text()”匹配模式,但它不起作用,我阅读了不同的答案并尝试了它们的方法: 我需要使用XSLT1.0。 感谢您的帮助,并向您致意

  • 我得到xml格式的响应,数据在xml节点的cData部分内。现在当我试图提取节点值,然后用cdata文本获取值。 我如何解析它? xml: 我使用代码来获取整个列表,但我只需要获取特定的节点 上面的代码列出了所有的cdata值... 我只需要从上面的xml中获取dbid、isdb、mydb值

  • 我正在尝试使用 xsl 转换转换第三方 xml,然后使用 JAXB 将生成的 xml 转换为 java 对象。但是,在两者之间的一些标记为 CDATA 的元素内容会丢失。 下面是我的第三方xml示例 XSL转换 Java 类 翻译 但是上面的代码将inputXml输出为]] 任何建议都将不胜感激。

  • 我有一个xml文档(输入文件不能更改),我需要用xsl转换到另一个xml。输入xsl有一个CDATA,如以下示例结构所示: 预期结果如下: 我的Xslt看起来像: 问题是xslt无法识别CDATA中的标记。如何为每个应用某种禁用输出转义?或者其他方法来解决这个问题?

  • 假设我有一个XML文件,如: 我想读取xslt转换器中的CDATA元素“name”,并将其值放在标记值的某个位置。我该怎么做?抱歉,我们不能对CDATA的内容使用xpath。是否有一些破解/解决方法?我希望在XSLT中严格执行此操作。

  • 我正在尝试编写一个时髦的脚本来更新 SoapUI 请求的某些 CDATA 部分。 我对SoapUI和groovy都是新手。 我已经成功地通过使用属性转移完成了我需要的事情,但是,由于我需要在几乎所有测试用例中执行相同的处理,因此我宁愿在可以从任何需要的地方调用的脚本中执行此操作。 我试图模仿groovy中的属性转移步骤,但是没有成功,因为我似乎无法访问和解析CDATA部分。 任何关于如何使用gro