我试图针对示例XML文件测试我的XSLT。 但是,输出只包含一个空标记。
我相信它在<when test="self::text()">
失败了
我想如果它是一个文本,它会打印出值。
请告诉我出了什么问题。
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xslt2.xslt"?>
<library>
<book><page>30</page></book>
<book>fun</book>
</library>
XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<result>
<xsl:call-template name="t">
<xsl:with-param name="b" select="."></xsl:with-param>
</xsl:call-template>
</result>
</xsl:template>
<xsl:template name="t">
<xsl:param name="b"/>
<xsl:for-each select="$b/*|$b/text()">
<xsl:choose>
<xsl:when test="self::text()">
<xsl:value-of select="." disable-output-escaping="no"></xsl:value-of>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
您的模板在忽略文档元素之前和之后的根节点/
空格上调用,并且不提供文本节点,因此根节点只有两个子节点,元素节点库和进程指令xml样式表。所以
$b/*
选择元素库和
$b/text()
不选择
所以xsl:for-each
只进行一次迭代,然后为测试self::text()"
答案 1 :(得分:0)
在XSLT中循环最好通过应用模板隐式完成。你的想法似乎受程序编程语言的影响太大了 例如,下面循环遍历所有子节点并提取文本值。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<result>
<xsl:apply-templates/>
</result>
</xsl:template>
<xsl:template match="*|text()">
<xsl:choose>
<xsl:when test="text()">
<xsl:value-of select="." disable-output-escaping="no"/>
</xsl:when>
</xsl:choose>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML,这给出了
<?xml version="1.0" encoding="UTF-8"?>
<result>30fun</result>