鉴于下面的XML文档:避免重复使用XSLT 1.0
<document>
<a>123</a>
<foo_1>true</foo_1>
<foo_2>false</foo_2>
<foo_3>true</foo_3>
<foo_4>true</foo_4>
<foo_5>false</foo_5>
<b/>
<bar_1>false</bar_1>
<bar_2>false</bar_2>
<bar_3>true</bar_3>
<bar_4>false</bar_4>
<bar_5>true</bar_5>
<c>some text</c>
</document>
我想通过消除包含false
所有列举的元件,并通过将含true
所有列举的元素到表单<prefix_n>value</prefix_n>
本文件变换,其中value
是下划线后的数字。
对于结果上面给出的应该是这样的例子:
<document>
<a>123</a>
<foo_n>1</foo_n>
<foo_n>3</foo_n>
<foo_n>4</foo_n>
<b/>
<bar_n>3</bar_n>
<bar_n>5</bar_n>
<c>some text</c>
</document>
对于这个我使用下面的转换,它工作正常。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<!-- standard copy template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[substring(name(), 1, 4) = 'foo_']">
<xsl:if test=". = 1 or . = 'true'">
<xsl:element name="foo_n">
<xsl:value-of select="substring-after(name(), 'foo_')"/>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template match="*[substring(name(), 1, 4) = 'bar_']">
<xsl:if test=". = 1 or . = 'true'">
<xsl:element name="bar_n">
<xsl:value-of select="substring-after(name(), 'bar_')"/>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
现在我面对的,我必须处理不同前缀的许多问题,不只是foo_
和bar_
。
有没有办法将模板规则转换成命名模板,我可以将前缀作为参数传入,从而避免编写大量重复的模板规则?
你想(或需要)列出所有可能的前缀吗? '_'分隔符的存在不够吗? –
不幸的不是。我在文档中还有其他元素,例如'a_b'。但是所有需要转换的元素的名称(只有那些)以正则表达式'_ [0-9] +'结尾,如果这有帮助的话。 – Markus