我有一个大的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>
知道我会怎么做吗?
答案 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?