在示例XML中,有两种形式匹配数字和类型;在第二个匹配表单中,我需要清空flag
元素的值。由于一些相互关联的样式表,我无法改变迭代的级别。如果我在preceding-sibling
上进行迭代,我可以formslist
但是当我在flag
元素上更深层次时,我似乎无法正确理解语法。在消隐之前,数字和类型都必须匹配。
<apply-templates match="formslist/flag">
<xsl:choose>
<xsl:when test=""></xsl:when>
</xsl:choose>
</apply-templates>
示例XML
<forms>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
<formslist>
<number>two</number>
<type>truck</type>
<flag>ex</flag>
</formslist>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
</forms>
答案 0 :(得分:1)
此转化:
<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:key name="kFlag" match="formslist/flag"
use="concat(../number, '+', ../type)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"flag/text()[generate-id(..)
!=
generate-id(key('kFlag',
concat(../../number,
'+',
../../type
)
)[1]
)
]
"/>
</xsl:stylesheet>
应用于提供的XML文档:
<forms>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
<formslist>
<number>two</number>
<type>truck</type>
<flag>ex</flag>
</formslist>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
</forms>
生成想要的正确结果:
<forms>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
<formslist>
<number>two</number>
<type>truck</type>
<flag>ex</flag>
</formslist>
<formslist>
<number>one</number>
<type>car</type>
<flag/>
</formslist>
</forms>
请注意使用Muenchian方法进行分组,这比使用与preceding-sibling::*
(最后一次具有O(N^2)
- 二次性能)的比较要快得多。
答案 1 :(得分:0)
在flag
的模板匹配内进行评估时,这应该可以实现您的目标:
<xsl:variable name="thisFormslist" select=".." />
<flag>
<xsl:choose>
<xsl:when test="../preceding-sibling::*[$thisFormslist/number=number and $thisFormslist/type=type]">
<!--number and type have been seen before, so don't put a value for this flag-->
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</flag>
它创建一个变量来引用当前的formslist
元素,然后在谓词过滤器中使用它来将number
和type
与父元素的preceding-sibling
元素进行比较元件(formslist
)。