1

我有一些类似的 XML

<ITEM><TITLE>Video: High Stakes for <KW>Obama</KW> &amp; Romney</TITLE></ITEM>

我想使用 XSLT 将其转换为以下 XML。

<ITEM><TITLE>Video: High Stakes for &lt;KW&gt;Obama&lt;/KW&gt; &amp; Romney</TITLE></ITEM>

我试过<xls:copy-of select="./TITLE"/>了,但这并没有转义 XML 标签。任何的想法?

4

2 回答 2

2

这类问题总是会吸引很多相互竞争的答案,因为最佳答案取决于您需要它的概括程度,而这在您的问题中并不清楚。

如果您想要一个超级通用的解决方案,我将把它留给常规的 XSLT SO 明星。或者您可以只搜索 SO 以查找有关如何序列化/或字符串化 XML 的问题。有很多。

我将为您提供一个非常简单但具体的解决方案,以对您的问题进行非常狭隘的解释。为此,我将假设:

  1. 您只对序列化TITLE元素的内容感兴趣。
  2. KW`)的子元素TITLE' (such as是受限制的,因为它们没有子元素和属性,并且不在命名空间中。

有了这种解释,这个输入文件......

<ITEM>
 <TITLE>Video: High Stakes for <KW>Obama</KW> &amp; Romney</TITLE>
</ITEM>

...由此 XSLT 1.0 样式表转换(在 2.0 中工作方式相同)...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />  

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

<xsl:template match="TITLE/*">
  <xsl:value-of select="concat('&lt;',name(),'&gt;',.,'&lt;/',name(),'&gt;')" />
</xsl:template>

</xsl:stylesheet>

...产量...

<ITEM>
  <TITLE>Video: High Stakes for &lt;KW&gt;Obama&lt;/KW&gt; &amp; Romney</TITLE>
</ITEM>
于 2012-10-08T00:14:14.330 回答
0

XSLT 没有特定的直接功能来破坏文本标记(如果这对您的情况真的有用,您必须好好考虑)。

这就是说,这是一个使用小型 C# 扩展函数的简短解决方案(可以为大多数其他 PL 和平台轻松编写类似的扩展函数):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:my="my:my" exclude-result-prefixes="msxsl my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/*/TITLE/*">
  <xsl:value-of select="my:stringize(.)"/>
  <xsl:apply-templates/>
 </xsl:template>

 <msxsl:script language="c#" implements-prefix="my">
  public string stringize(XPathNavigator doc)
  {
   return doc.OuterXml;
  }
 </msxsl:script>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<ITEM><TITLE>Video: High Stakes for <KW>Obama</KW> &amp; Romney</TITLE></ITEM>

产生了想要的正确结果

<ITEM>
  <TITLE>Video: High Stakes for &lt;KW&gt;Obama&lt;/KW&gt; &amp; Romney</TITLE>
</ITEM>

请注意

  1. 该解决方案将整个子树展平为文本,该子树植根于一个TITLE元素,该元素是 XML 文档顶部元素的子元素 - 无论深度如何 - 另一个发布的答案没有。

  2. 该解决方案正确地展平了具有属性或空元素的元素 - 另一个发布的答案 - 没有。

于 2012-10-08T00:34:38.633 回答