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

如何解析XSLT中CDATA元素内的XML DOM?

暴骏奇
2023-03-14

假设我有一个XML文件,如:

<library>
 <books>
  <![CDATA[<genre><name>Sci-fi</name><count>2</count></genre>]]>
  <book>
   <name>
    Some Book
   </name>
   <author>
    Some author
   </author>
  <book>
  <book>
   <name>
    Another Book
   </name>
   <author>
    Another author
   </author>
  <book>
 <books>
</library>

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

共有3个答案

单于奇略
2023-03-14

由于CDATA块是(部分)文本节点,因此您可以提取两个“标记”之间的文本,例如:

<xsl:template match="text()">
  <xsl:value-of select="substring-before(substring-after(., '&lt;name>'), '&lt;/name>')"/>
</xsl:template>

这只是一个简单的想法。如果CDATA中有多个名称“element”,只需递归地多次应用上述表达式即可。

鞠嘉誉
2023-03-14

您还可以选择CDATA部分,然后将结果传递给第二个XSL。

例如,如果您将CDATA部分按如下方式导出:

<xsl:template match="//books/text()">
  <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

您将得到如下结果:

<genre><name>Sci-fi</name><count>2</count></genre>

然后可以对其应用另一个XSL,如果只处理DOM,则可以应用XPATH。这是假设您的CDATA始终是有效的XML。否则,Martin的正则表达式答案就是正确的。

江鸿羲
2023-03-14

一些XSLT产品具有扩展函数,例如saxon:parse(),它允许您获取包含词法XML的字符串并将其转换为节点树。

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

  • 我有一个带有文本元素的XML,它可以包括标记的文本,并且取决于元素属性值,我知道内容是CDATA封装的还是XHTML。 因为我不能在文本元素中拥有/创建任何子元素,所以如果我得到XHTML,我将需要封装。 这只是我需要在XSLT中转换的许多元素中的一个 一个简短的xml示例 我终于试过了,它确实达到了目的。只是html标记没有被保留。 这将产生以下结果(请注意 标记在第一个文本中消失) 我还尝试使

  • 我在CDATA标记中有一些XML格式的文本。XSLT将此数据放在列表属性名称中 有人能帮我解决这个问题吗?

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

  • 标记指定针对节点内容的多个条件测试以及和元素。 声明 以下是元素的语法声明。 元素 父元素 - , , , , , , , , , , , , , , , 输出元素 子元素 - , 示例 此示例通过迭代每个学生创建一个元素的表格,其元素属性为,其子元素:,,和。 它会检查并打印等级详细信息。 文件:students.xml - 文件:students.xsl - 在浏览器中打上面文件:studen

  • 我想使用xslt转换一些xml文件,但遇到了一个大问题。 在我的输入文件中,我有CDATA标记,它包含xml子树-S,应该复制到输出标记中。我们知道关于这些CDATA标记的一些信息: 我的xsl如下所示: 这样做的输出将是: 注意:如果您在eclipse中测试这个示例,它可以工作( 不会为空),但是xsl:value-of select应该只在元素中工作!因此,在message broker中,它