如何使用XSLT阅读多功能XML标签?

时间:2011-10-15 08:16:59

标签: html xml xslt

在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部分。

1 个答案:

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