基本XSLT的when-test条件标记

时间:2012-03-11 05:52:39

标签: xml xslt

我试图针对示例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>

2 个答案:

答案 0 :(得分:1)

您的模板在忽略文档元素之前和之后的根节点/空格上调用,并且不提供文本节点,因此根节点只有两个子节点,元素节点库和进程指令xml样式表。所以

$b/*

选择元素库和

$b/text()

不选择

所以xsl:for-each只进行一次迭代,然后为测试self::text()"

返回false

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