你能想到的最简单的XSLT转换是什么?它可以将第一个(在这种情况下是唯一的)
/configuration/system.web/compilation/@debug
属性的值从true
转换为false
。这个转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="system.web/compilation[1]/@debug">
<xsl:attribute name="debug">false</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
当应用于此XML文档时:
<configuration>
<system.web>
<compilation debug="true" defaultLanguage="C#">
<!-- this is a comment -->
</compilation>
<compilation debug="true" defaultLanguage="C#">
<!-- this is another comment -->
</compilation>
</system.web>
</configuration>
产生所需的正确结果:修改任何system.web
元素的第一个compilation
子元素的debug
属性(但我们知道配置文件中只有一个system.web
元素)。
<configuration>
<system.web>
<compilation debug="false" defaultLanguage="C#">
<!-- this is a comment -->
</compilation>
<compilation debug="true" defaultLanguage="C#">
<!-- this is another comment -->
</compilation>
</system.web>
</configuration>
正如我们所看到的,只有第一个debug
属性被修改为false
,符合要求。
xsl:attribute
元素必须提及要更改的属性名称,而这已经在封闭的 xsl:template
匹配的 XPath 中给出。有没有办法说“设置此属性,无论它叫什么”? - Tom Anderson<someElement attr1="{someExpression}"/>
。这不是你想要的,但在某些方面甚至更好。 - Dimitre Novatchev在<compilation>
内部使用<xsl:attribute name="debug">false</xsl:attribute>
吗?还是我误解了问题?