xsl从特定节点中删除注释

时间:2012-01-19 09:59:05

标签: xml xslt

我有一个大的XML文件设置我的应用程序。每个配置都有很多注释。我想根据节点使用xsl删除一些注释。

<!-- if you need to use storage -->
<Storage>
    <!-- Oracle configuration
    <StorageDb database="OracleService"></StorageDb>
    -->
    <!-- SqlServer configuration
    <StorageDb database="SqlService"></StorageDb>
    -->
</Storage>

当我运行我的xsl时,我想删除Oracle配置中的注释,因此我的结果将是:

<!-- if you need to use storage -->
<Storage>
    <StorageDb database="OracleService"></StorageDb>

    <!-- SqlServer configuration
    <StorageDb database="SqlService"></StorageDb>
    -->
</Storage>

知道我会怎么做吗?

3 个答案:

答案 0 :(得分:3)

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

<xsl:template match="comment()">
    <xsl:value-of disable-output-escaping="yes" select="substring-after(.,'Oracle configuration')"/>
</xsl:template>

答案 1 :(得分:2)

如果我说得对,你问的不是删除评论节点,而是分析它们并将它们转换为元素。你可以使用XSLT 2.0和正则表达式功能来做到这一点,但我不认为这是一个好主意(不是很强大)。

无论如何,XSLT可以帮助您,但您首先必须为配置文件构建一个squelet。让我们想象一下这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    ...
    <Storage/>
    ...
</configuration>

你的XSLT看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:param name="service" select="'OracleService'"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Storage">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <StorageDb database="{$service}"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

默认行为为OracleService参数选择值service。可以通过将另一个值传递给此参数的XSLT来覆盖此行为。

默认结果是:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    ...
    <Storage><StorageDb database="OracleService"/></Storage>
    ...
</configuration>

答案 2 :(得分:1)

如果你可以使用Saxon作为你的XSLT处理器,那么一种强有力的方法(我的意思是,一种不依赖于disable-output-escaping的方法)就是使用saxon:parse()剥离不需要的文本后,每个评论节点的内容。 saxon:parse()的结果是一个XML节点,可以正常方式输出到结果文档。

E.g:

<xsl:template match="comment()">
    <xsl:copy-of select="saxon:parse(substring-after(., 'configuration'))"/>
</xsl:template>

有关详细信息,请参阅XSLT parse text node as XML?