在HTML中,分别有下划线和加粗<u>
和<b>
的标记。假设我创建一个标签来执行这些或两者中的任何一个,然后如何使用XSLT来解释它。?
例如 -
<Line type="B">stackoverflow</Line>
<Line type="U">stackoverflow</Line>
<Line type="BU">stackoverflow</Line>
HTML输出应该是这样的 -
<b>stackoverflow</b>
<u>stackoverflow</u>
<b><u>stackoverflow</b></u>
我想这个功能只适用于XSLT部分。
答案 0 :(得分:1)
执行此操作的一种方法是使用递归模板,该模板以递归方式检查行的类型属性的每个字母。因此,要创建第一个元素,您将执行以下操作(其中$ type是包含属性值的变量):
<xsl:element name="{substring($type, 1, 1)}">
然后,您将使用属性值的剩余部分
递归调用命名模板<xsl:call-template name="Line">
<xsl:with-param name="type" select="substring($type, 2)"/>
</xsl:call-template>
因此,给出以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Line" name="Line">
<xsl:param name="type" select="@type"/>
<xsl:choose>
<xsl:when test="not($type)">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{substring($type, 1, 1)}">
<xsl:call-template name="Line">
<xsl:with-param name="type" select="substring($type, 2)"/>
</xsl:call-template>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
应用于以下XML
<Lines>
<Line type="B">stackoverflow</Line>
<Line type="U">stackoverflow</Line>
<Line type="BU">stackoverflow</Line>
<Line>No format</Line>
</Lines>
将输出以下内容
<Lines>
<B>stackoverflow</B>
<U>stackoverflow</U>
<B><U>stackoverflow</U></B>
No format
</Lines>
注意,要在这种情况下停止输出 Lines 元素,只需将以下模板添加到XSLT:
<xsl:template match="Lines">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>