Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSL转换注释_Xml_Xslt_Comments_Xslt 1.0 - Fatal编程技术网

Xml XSL转换注释

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

我正在使用XSLT1.0将一些XML转换为另一个XML。只需要对内容进行一些处理

输入XML有一些注释,它们是扩展字符实体形式。我需要它,使它像一个定期评论

输入如下:



测试标题

!--测试注释--

测试段落!——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, '&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>

-根据澄清进行编辑-

也许可以这么简单:

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, '&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>


代码是`你知道
test
元素总是包含这样一条注释而没有其他内容吗?代码是`你知道
test
元素总是包含这样一条注释而没有其他内容吗?谢谢你的回答。但实际上注释可以出现任何元素中的任何位置。此外,父元素还可以包含一些其他平面文字,甚至子元素。因此,Xslt的主要目的是保持相同的内容,以处理注释。输入XML是由脚本生成的,该脚本使内部的注释无效。正在尝试使用XSLT使XML有效。请编辑您的问题,并显示输入和预期输出的代表性示例。使用示例输入和预期输出修改问题查看我修改的答案。非常感谢您的快速回答。我只是修改了代码,以便在输出中只扩展注释。可以有一些其他的字符实体,它们应该与输入内容保持一致。谢谢你的回答。但实际上,注释可以出现在任何元素的任何地方。此外,父元素还可以包含一些其他平面文字,甚至子元素。因此,Xslt的主要目的是保持相同的内容,以处理注释。输入XML是由脚本生成的,该脚本使内部的注释无效。正在尝试使用XSLT使XML有效。请编辑您的问题,并显示输入和预期输出的代表性示例。使用示例输入和预期输出修改问题查看我修改的答案。非常感谢您的快速回答。我只是修改了代码,以便在输出中只扩展注释。可能还有一些其他字符实体应与输入保持相同