有这个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>
如何模板输出是否符合预期?
提前致谢
答案 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中有命名空间。)