鑑於下面的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