我必须使用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后重命名标签吗?我不明白我在这里错过了什么?
提前感谢
发布于 2016-04-28 18:16:21
CDATA中没有元素,只有文本。这就是CDATA的意思:“这个东西可能看起来像标记,但我希望它被视为文本”。
将文本转换为元素称为解析,因此要从CDATA中的文本中提取元素,您必须对其进行解析。在XSLT 3.0 (它有一个parse-xml()函数)之前,没有直接的方法可以在XSLT中做到这一点。一些XSLT处理程序有一个扩展函数来做这件事;在一些(我相信) exslt:node-set()函数中,如果您提供一个字符串作为输入,就可以做这件事。对于其他代码,您可以调用您自己的Java或Javascript代码来执行解析。所以这一切都变得依赖于处理器。
另一种方法是使用禁用-输出-转义技巧在CDATA节中输出XML,然后在第二个转换中处理它。
最好的方法是在开始之前去掉CDATA标签。他们从一开始就不应该被放在那里。
https://stackoverflow.com/questions/36904308
复制相似问题