Xslt提取属性并生成html

时间:2012-02-22 00:18:23

标签: xslt

我正在尝试转换以下XML ..

<?xml version="1.0" encoding="utf-16"?><Member TextRank="unknown" FullName="My Name" ..etc.. />

进入以下内容,

<div class="member">
    <span class="label">
        Text Rank (note: i want to override the labels in the xslt)
    </div>
    <span class="value">
        unknown
    </span>
    <span class="label">
        Full Name
    </div>
    <span class="value">
        My Name
    </span>
    ..etc..
</div>

如果可能,我怎么能用xslt做到这一点?

2 个答案:

答案 0 :(得分:1)

这是一种不同的方法,可以满足 xsl:choose 元素的需求。相反,您可以利用匹配模板为要覆盖的名称的属性案例创建特定模板,并为其他案例使用通用模板。

为避免重复代码,您还可以将通用模板设为命名模板,并使用参数覆盖名称

<xsl:template match="@*" name="attribute">
   <xsl:param name="label" select="local-name()" />

因此,大多数属性的默认值是使用属性名称,但 @FullName 的特定模板可以使用不同的名称调用它。

<xsl:template match="@FullName">
   <xsl:call-template name="attribute">
      <xsl:with-param name="label" select="'Full Name'" />
   </xsl:call-template>
</xsl:template>

这是完整的XSLT:

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

   <xsl:template match="*">
      <div class="{local-name()}">
         <div> Title: </div>
         <xsl:apply-templates select="@*"/>
      </div>
   </xsl:template>

   <xsl:template match="@FullName">
      <xsl:call-template name="attribute">
         <xsl:with-param name="label" select="'Full Name'" />
      </xsl:call-template>
   </xsl:template>

   <xsl:template match="@*" name="attribute">
      <xsl:param name="label" select="local-name()" />
      <span class="label">
         <xsl:value-of select="concat($label, ' : ')"/>
      </span>
      <span class="value">
         <xsl:value-of select="."/>
      </span>
      <br/>
   </xsl:template>
</xsl:stylesheet>

应用于以下XML时:

<Member TextRank="unknown" ID="12" FullName="My Name" Dob="01/01/1970" />

以下是输出:

<div class="Member">
   <div> Title: </div>
   <span class="label">TextRank : </span>
   <span class="value">unknown</span>
   <br>
   <span class="label">ID : </span>
   <span class="value">12</span>
   <br>
   <span class="label">Full Name : </span>
   <span class="value">My Name</span>
   <br>
   <span class="label">Dob : </span>
   <span class="value">01/01/1970</span>
   <br>
</div>

答案 1 :(得分:0)

这是我提出的解决方案。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
    <xsl:output indent="yes" />
    <xsl:template match="*">
        <xsl:element name="div">
            <xsl:attribute name="class">className</xsl:attribute>
            <div>
                Title:
            </div>

            <!-- UID, Name, DBO-->
            <xsl:apply-templates select="@ID"/>
            <xsl:apply-templates select="@FullName"/>
            <xsl:apply-templates select="@Dob"/>

        </xsl:element>

    </xsl:template>

    <xsl:template match="@*">
        <xsl:element name="span">

            <xsl:attribute name="class">label</xsl:attribute>
            <xsl:choose>
                <xsl:when test="name() = 'FullName'">
                    Full Name
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="name()"/>
                </xsl:otherwise>
            </xsl:choose>
            :
        </xsl:element>
        <xsl:element name="span">
            <xsl:attribute name="class">value</xsl:attribute>
            <xsl:value-of select="."/>
        </xsl:element>
        <br/>
    </xsl:template>

</xsl:stylesheet>