我对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>
如果我有父节点的显式模板,我应该为父节点的所有子节点都有一个显式模板吗?
答案 0 :(得分:6)
您所看到的只是built-in rules的效果,它会输出节点的文本值并将模板应用于其所有子节点。
如果您覆盖内置模板,那么您的模板会生效。您希望apply object
的所有子项的内置规则{/ 3}
<?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>
答案 1 :(得分:1)
你在#2中的规则说什么也不做,所以它没有做任何事情。你需要在那里写点东西。请参阅xsl:copy
和xsl:apply-templates
。
答案 2 :(得分: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>
它将使用默认规则继续向下处理。只要您按照自己的方式发送处理,就不一定需要做任何特定的处理子节点的事情。