【问题标题】:XSLT transformation and CDATAXSLT 转换和 CDATA
【发布时间】:2016-08-22 14:32:59
【问题描述】:

我必须使用 XSLT 转换我的输入 xml。 它包含 CDATA,我需要从 CDATA 中提取元素,然后我必须重命名标签。

以下是我的输入 xml:

 <getArtifactContentResponse>
        <return>
             <![CDATA[
       <metadata>
        <overview>        
            <name>scannapp</name>
            <developerId>developer702</developerId>
            <stateId>2</stateId>
            <serverURL>dddd</serverURL>
            <id>cspapp1103</id>
            <description>scann doc</description>
            <hostingTypeId>1</hostingTypeId>
     </overview>
    </metadata>
      ]]>
      </return>
    </getArtifactContentResponse> 

预期的输出是:

 <?xml version="1.0" encoding="UTF-8"?>
   <metadata >
    <information>        
        <name>scannapp</name>
        <developerId>developer702</developerId>
        <stateId>2</stateId>
        <serverURL>ddddd</serverURL>
        <id>cspapp1103</id>
        <description>scann doc</description>
        <hostingTypeId>1</hostingTypeId>        
    </Information>
</metadata>

我正在使用的 XSLT 如下:

<xsl:output method="xml" version="1.0" encoding="UTF-8" />
<xsl:template match="/">
    <xsl:value-of select="//ns:getArtifactContentResponse/ns:return/text()" disable-output-escaping="yes"/>
</xsl:template>


<xsl:template match="overview">
     <Information>
            <xsl:apply-templates select="@* | node()" />
    </Information>
</xsl:template>

有了这个,我可以提取 CDATA,但它不会将元素 'overview' 重命名为 'Information' 。

转换后的xml如下:

<?xml version="1.0" encoding="UTF-8"?>

   <metadata>
    <overview>        
        <name>scannapp</name>
        <developerId>developer702</developerId>
        <stateId>2</stateId>
        <serverURL>dddddd</serverURL>
        <id>cspapp1103</id>
        <description>scann doc</description>
        <hostingTypeId>1</hostingTypeId>        
    </overview>
</metadata>

谁能告诉我如何在提取 CDATA 后重命名标签? 我不明白我在这里缺少什么?

提前致谢

【问题讨论】:

  • 如果您只有 XSLT 1.0 版,您需要在初始 XSLT 的输出上运行另一个 XSLT 以产生所需的输出。 CData 的内容被认为是纯文本,因此不能像普通 XML 片段一样被 XSLT 处理。
  • 我不清楚。你能用上面的例子解释一下吗?
  • Link no.1 展示了 2 变换方法。您已经拥有用于第一个转换步骤的 XSLT。现在创建另一个 XSLT 将第一个转换的输出转换为最终的预期输出...
  • 现在,我有两个 xslt。但是我可以按顺序应用这两个 xslt 吗?我不应该明确使用两个 xsl 文件。

标签: xslt rename cdata extraction


【解决方案1】:

您的 CDATA 中没有元素,只有文本。这就是 CDATA 的意思:“这些东西可能看起来像标记,但我希望它被视为文本”。

将文本转换为元素称为解析,因此要从 CDATA 中的文本中提取元素,您必须对其进行解析。在 XSLT 3.0(它有一个 parse-xml() 函数)之前,在 XSLT 中没有直接的方法可以做到这一点。一些 XSLT 处理器有一个扩展函数来做这件事;在某些(我相信)中,如果您提供字符串作为输入,exslt:node-set() 函数会执行此操作。与其他人一起,您可以调用自己的 Java 或 Javascript 代码来进行解析。所以这一切都取决于处理器。

另一种方法是使用禁用输出转义技巧在 CDATA 部分中输出 XML,然后在第二次转换中对其进行处理。

最好的方法是在开始之前去掉 CDATA 标记。一开始就不应该把它们放在那里。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2021-05-24
    相关资源
    最近更新 更多