【问题标题】:XSLT default template confusionXSLT 默认模板混淆
【发布时间】:2013-01-04 22:48:01
【问题描述】:

我对 XSLT 处理节点的方式感到困惑,假设我有一个这样的 XML 文档:

<object>
        <animal>
                <man men="asd">man1</man>
                <man>man2</man>
                <man>man3</man>
                <man>man4</man>
                <cat>cat1</cat>
                <cat>cat2</cat>
                <cat>cat3</cat>
                <cat>cat4</cat>
        </animal>
        <vehicule>
                <car>car1</car>
                <car>car2</car>
                <car>car3</car>
                <car>car4</car>
        </vehicule>
</object>

当我有一个没有任何模板匹配的 XSLT(如下所示)时,它返回所有文本节点且没有属性节点,这没关系

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
</xsl:stylesheet>

但是当我有一个像下面这样的时,它不会返回任何东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="object">
        </xsl:template>
</xsl:stylesheet>

如果我有一个父节点的显式模板,我应该有一个父节点的所有子节点的显式模板吗?

【问题讨论】:

    标签: xslt


    【解决方案1】:

    您所看到的只是built-in rules 的效果,它输出节点的文本值并将模板应用于其所有子节点。

    如果你覆盖了内置模板,那么你的模板就会生效。你想applyobject的所有孩子的内置规则:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match="object">
        <xsl:apply-templates select="*" />
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 那么,如果我有一个父节点的模板,我应该有一个所有子节点的模板吗??
    • @Noor 不完全是。 XSLT 处理只包括处理文档的根节点,仅此而已(除非模板建议处理器处理子节点)。子节点被空模板忽略。
    【解决方案2】:

    你在#2 中的规则说什么都不做,所以它什么也不做。你需要在里面写点东西。请参阅xsl:copyxsl:apply-templates

    【讨论】:

    • 但是即使什么都没有,难道隐含的内置规则不适用吗??
    • @Noor 否。如果没有匹配的模板,则应用内置规则。您编写一个匹配的模板,其中的内容由您决定。
    【解决方案3】:

    http://cafeconleche.org/books/xmljava/chapters/ch17.html#d0e31297

    正如其他人所说,XSLT 默认模板规则的定义方式是,默认情况下,它们将匹配文档的顶部节点,然后递归处理每个子节点,一直到底部。您的模板覆盖了根节点的默认规则,并且没有任何指令可以对其进行任何操作,因此它不会再进一步​​。如果你有这个:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
            <xsl:template match="object">
                <xsl:apply-templates />
            </xsl:template>
    </xsl:stylesheet>
    

    它将使用默认规则继续向下处理。只要您以他们的方式发送处理,您不一定需要执行任何特定的操作来处理子节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2011-01-08
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多