2017-09-14 76 views
0

我正在使用XSLT1.0将某些XML转换为另一个XML。只需要做一些内容处理。XSL转换注释

输入XML有一些评论,这是在一个扩展的特性实体形式。我需要它使它像一个正常的评论。

输入是如下,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">

<concept id="test">
<title>Test title</title>
<conbody>&lt;!-- test comments--&gt;

<p>test paragraph &lt;!-- comments in p --&gt;</p>

</conbody>
</concept>

所需输出注释应该是这样的下方,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">

<concept id="test">
<title>Test title</title>
<conbody><!-- test comments-->

<p>test paragraph <!-- comments in p --></p>

</conbody>
</concept>

的评论真的应该来像上面。但我不确定是否可以在XSLT中执行此操作。

有人可以帮忙吗?

+0

的代码是 的 ' – Gpn008

+0

那么你知道'test'元素总是包含这样的注释吗? –

回答

0

- 响应编辑,以澄清 -

也许它可能是这样简单:

XSLT 1.0

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

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

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

</xsl:stylesheet> 

这是假设你的处理链的载体DOE。

它也假设你的XML不带有其他不应该转义的转义标记。如果这不是一个安全的假设,然后使用:

<xsl:template match="text()" name="unescape-comments"> 
    <xsl:param name="text" select="."/> 
    <xsl:choose> 
     <xsl:when test="contains($text, '&lt;!--')"> 
      <xsl:value-of select="substring-before($text, '&lt;!--')"/> 
      <xsl:comment> 
       <xsl:value-of select="substring-before(substring-after($text, '&lt;!--'), '--&gt;')"/> 
      </xsl:comment> 
      <xsl:call-template name="unescape-comments"> 
       <xsl:with-param name="text" select="substring-after($text, '--&gt;')"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

谢谢你的回答。但实际上评论可能来自任何元素的任何地方。此外,父元素可以包含一些其他平面文本或甚至子元素。所以Xslt的主要目的是保持相同的内容来处理评论。输入XML是由一个使注释无效的脚本生成的。尝试使用XSLT使XML有效。 – Gpn008

+0

请编辑您的问题,并显示一个**代表**输入和预期输出的例子。 –

+0

修改了样本输入和预期输出的问题 – Gpn008