根据内容在XSLT中格式化输出

时间:2017-05-26 14:59:23

标签: html xml xslt

有这个xml片段:

<paragraph><bold>Test</bold> - This <italic>word</italic> should be <underline>underlined</underline> according to xml</paragraph>

如何将使用过的标签替换为HTML中使用的标签,将此“段落”输出到HTML格式?

我已尝试过这个XSLT代码段,但它不会在嵌套代码之外打印文本,只会打印粗体,斜体和下划线之间的文本。

<xsl:template match="p:paragraph">
                <xsl:for-each select="./*">
                    <xsl:choose>
                        <xsl:when test="name(.)='bold'">
                            <xsl:apply-templates select="."/>
                        </xsl:when>
                        <xsl:when test="name(.)='italic'">
                            <xsl:apply-templates select="."/>
                        </xsl:when>
                        <xsl:when test="name(.)='underlined'">
                            <xsl:apply-templates select="."/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="./text()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
</xsl:template>

<xsl:template match="bold">
    <p><b><xsl:value-of select="current()"/></b></p>
</xsl:template>

<xsl:template match="italic">
    <p><i><xsl:value-of select="current()"/></i></p>
</xsl:template>

<xsl:template match="underline">
    <p><u><xsl:value-of select="current()"/></u></p>
</xsl:template>

如何模板输出是否符合预期?

提前致谢

1 个答案:

答案 0 :(得分:2)

您的主要问题是./*(可简化为*)仅选择元素,但您也想选择文本节点。所以你能做的就是改变它......

<xsl:for-each select="node()">

您还需要将xsl:otherwise更改为此...

<xsl:otherwise>
    <xsl:value-of select="."/>
</xsl:otherwise>

但是,您可以简化整个XSLT以更好地利用模板匹配。试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" indent="yes" />

    <xsl:template match="paragraph">
        <p>
            <xsl:apply-templates />
        </p>
    </xsl:template>

    <xsl:template match="bold">
        <b>
           <xsl:apply-templates /> 
        </b>
    </xsl:template>

    <xsl:template match="italic">
        <i>
           <xsl:apply-templates /> 
        </i>
    </xsl:template>

    <xsl:template match="underline">
        <u>
           <xsl:apply-templates /> 
        </u>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

(显然你需要调整它来处理命名空间,因为你当前的XSLT正在选择p:paragraph,这表明你的XML中有命名空间。)