2

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

<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>

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

4

3 回答 3

6

您所看到的只是内置规则的效果,它输出节点的文本值并将模板应用于其所有子节点。

如果你覆盖了内置模板,那么你的模板就会生效。您想对的所有子级应用内置规则object

<?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>
于 2013-01-04T22:52:17.727 回答
1

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

于 2013-01-04T22:55:34.303 回答
0

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>

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

于 2013-01-06T06:27:43.270 回答