我的问题与Two Phase Processing上另一张海报的StackOverflow问题有关。我不想在没有完全理解它的情况下使用mode =“#all”以及它如何影响我的XSLT的其余部分。我认为下面的代码完成了同样的事情,没有冒险干扰其他模板,但想要确认。有点似乎我正在处理$ completepolicy两次而不需要这样做。
空标记定义:<field/> <field></field>
。标签可以具有属性,但永远不会有具有属性的空标签。永远不会有<field> </field>
的节点,其中空格可以表示许多其他内容。
鉴于此XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<!-- many other apply-templates here -->
<xsl:variable name="completepolicy" as="element()">
<holder>
<TABLE1 type="global">
<col1>Red</col1>
<col2/>
</TABLE1>
<TABLE2>
<field1>Blue</field1>
<field2/>
</TABLE2>
</holder>
</xsl:variable>
<xsl:apply-templates mode="emptytags" select="$completepolicy/*"/>
</xsl:template>
<xsl:template match="*[not(node())]" mode="emptytags"/>
<xsl:template match="node() | @*" mode="emptytags">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="#current"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
$ completepolicy的输出结果:
<TABLE1 type="global">
<col1>Red</col1>
</TABLE1>
<TABLE2>
<field1>Blue</field1>
</TABLE2>
答案 0 :(得分:0)
为什么您认为$completepolicy
变量正在处理两次?这在提供的代码中无法看到。
我确认提供的代码对我来说很好。
我建议永远不要使用mode="#all"
。这太强大而且危险 - 这几乎不需要。