Xml XSL转换注释
我正在使用XSLT1.0将一些XML转换为另一个XML。只需要对内容进行一些处理 输入XML有一些注释,它们是扩展字符实体形式。我需要它,使它像一个定期评论 输入如下:Xml XSL转换注释,xml,xslt,comments,xslt-1.0,Xml,Xslt,Comments,Xslt 1.0,我正在使用XSLT1.0将一些XML转换为另一个XML。只需要对内容进行一些处理 输入XML有一些注释,它们是扩展字符实体形式。我需要它,使它像一个定期评论 输入如下: 测试标题 !--测试注释-- 测试段落!——p中的注释-- 所需的输出注释如下: 测试标题 测试段落 评论应该像上面那样。但我不确定是否可以在XSLT中实现这一点 有人能帮忙吗?-根据澄清编辑- 也许可以这么简单: XSLT1.0 <xsl:stylesheet version="1.0" xmln
测试标题
!--测试注释--
测试段落!——p中的注释--
所需的输出注释如下:
测试标题
测试段落
评论应该像上面那样。但我不确定是否可以在XSLT中实现这一点
有人能帮忙吗?-根据澄清编辑-
也许可以这么简单:
XSLT1.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, '<!--')">
<xsl:value-of select="substring-before($text, '<!--')"/>
<xsl:comment>
<xsl:value-of select="substring-before(substring-after($text, '<!--'), '-->')"/>
</xsl:comment>
<xsl:call-template name="unescape-comments">
<xsl:with-param name="text" select="substring-after($text, '-->')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
-根据澄清进行编辑-
也许可以这么简单:
XSLT1.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, '<!--')">
<xsl:value-of select="substring-before($text, '<!--')"/>
<xsl:comment>
<xsl:value-of select="substring-before(substring-after($text, '<!--'), '-->')"/>
</xsl:comment>
<xsl:call-template name="unescape-comments">
<xsl:with-param name="text" select="substring-after($text, '-->')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
代码是`你知道test
元素总是包含这样一条注释而没有其他内容吗?代码是`你知道test
元素总是包含这样一条注释而没有其他内容吗?谢谢你的回答。但实际上注释可以出现任何元素中的任何位置。此外,父元素还可以包含一些其他平面文字,甚至子元素。因此,Xslt的主要目的是保持相同的内容,以处理注释。输入XML是由脚本生成的,该脚本使内部的注释无效。正在尝试使用XSLT使XML有效。请编辑您的问题,并显示输入和预期输出的代表性示例。使用示例输入和预期输出修改问题查看我修改的答案。非常感谢您的快速回答。我只是修改了代码,以便在输出中只扩展注释。可以有一些其他的字符实体,它们应该与输入内容保持一致。谢谢你的回答。但实际上,注释可以出现在任何元素的任何地方。此外,父元素还可以包含一些其他平面文字,甚至子元素。因此,Xslt的主要目的是保持相同的内容,以处理注释。输入XML是由脚本生成的,该脚本使内部的注释无效。正在尝试使用XSLT使XML有效。请编辑您的问题,并显示输入和预期输出的代表性示例。使用示例输入和预期输出修改问题查看我修改的答案。非常感谢您的快速回答。我只是修改了代码,以便在输出中只扩展注释。可能还有一些其他字符实体应与输入保持相同