XSLT 'apply-templates' 和 'apply-templates with mode' 一次完成
XSLT 'apply-templates' and 'apply-templates with mode' in a single go
我正在尝试使用 apply-templates 和 apply-templates 模式,如以下示例中所述:
我的输入 xml 看起来像:
<catalog>
<product dept="aaa">
<number>111</number>
<name>cap</name>
<color>blue</color>
</product>
<product dept="bbb">
<number>222</number>
<name>bat</name>
<color>white</color>
</product>
<product dept="ccc">
<number>333</number>
<name>bag</name>
<color>red</color>
</product>
现在我正在尝试使用下面显示的 xslt 来删除带有 dept=bbb 的产品元素,但它不起作用。相同的输入 xml 出现在输出中。我知道我可以通过删除最后一个模板上的 mode 属性来达到我想要的结果,但我试图理解为什么它不能像我在这里尝试的那样工作。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
<xsl:template match="/">
<xsl:variable name="modXml">
<xsl:apply-templates />
<xsl:apply-templates mode="remove" />
</xsl:variable>
<xsl:copy-of select="exsl:node-set($modXml)/*" />
</xsl:template>
<xsl:template match="node( ) | @*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="/catalog/product[@dept='bbb']" mode="remove" />
</xsl:stylesheet>
有人可以解释一下 XSLT 处理器是如何 运行 转换的吗?
非常感谢..!
这里:
<xsl:variable name="modXml">
<xsl:apply-templates />
<xsl:apply-templates mode="remove" />
</xsl:variable>
当你第一次做的时候:
<xsl:apply-templates />
您正在将身份转换 模板应用到文档中的所有 节点(递归)。完成此操作后,变量已包含整个文档的副本。从现在开始,您所做的任何事情都不会改变这一点。
然后,当你这样做时:
<xsl:apply-templates mode="remove" />
您正在 添加 到变量的现有 result-tree-fragment。碰巧的是,应用的模板实际上并没有添加任何东西——但它也没有从已经存在的结果中删除任何东西。没办法。
我正在尝试使用 apply-templates 和 apply-templates 模式,如以下示例中所述:
我的输入 xml 看起来像:
<catalog>
<product dept="aaa">
<number>111</number>
<name>cap</name>
<color>blue</color>
</product>
<product dept="bbb">
<number>222</number>
<name>bat</name>
<color>white</color>
</product>
<product dept="ccc">
<number>333</number>
<name>bag</name>
<color>red</color>
</product>
现在我正在尝试使用下面显示的 xslt 来删除带有 dept=bbb 的产品元素,但它不起作用。相同的输入 xml 出现在输出中。我知道我可以通过删除最后一个模板上的 mode 属性来达到我想要的结果,但我试图理解为什么它不能像我在这里尝试的那样工作。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
<xsl:template match="/">
<xsl:variable name="modXml">
<xsl:apply-templates />
<xsl:apply-templates mode="remove" />
</xsl:variable>
<xsl:copy-of select="exsl:node-set($modXml)/*" />
</xsl:template>
<xsl:template match="node( ) | @*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="/catalog/product[@dept='bbb']" mode="remove" />
</xsl:stylesheet>
有人可以解释一下 XSLT 处理器是如何 运行 转换的吗?
非常感谢..!
这里:
<xsl:variable name="modXml">
<xsl:apply-templates />
<xsl:apply-templates mode="remove" />
</xsl:variable>
当你第一次做的时候:
<xsl:apply-templates />
您正在将身份转换 模板应用到文档中的所有 节点(递归)。完成此操作后,变量已包含整个文档的副本。从现在开始,您所做的任何事情都不会改变这一点。
然后,当你这样做时:
<xsl:apply-templates mode="remove" />
您正在 添加 到变量的现有 result-tree-fragment。碰巧的是,应用的模板实际上并没有添加任何东西——但它也没有从已经存在的结果中删除任何东西。没办法。