Xslt提取属性并生成html

发布于 2025-01-08 04:56:29 字数 599 浏览 0 评论 0原文

我正在尝试将以下 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 来完成此操作?

I'm trying to transform the following XML..

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

Into something like the following,

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

How if possible could I do this using xslt?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柠栀 2025-01-15 04:56:29

这是一种不同的方法,它消除了对 xsl:choose 元素的需要。相反,您可以利用匹配模板为您想要覆盖的属性名称的情况提供特定模板,并为其他情况提供通用模板。

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

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

因此,大多数属性的默认值是使用属性名称,但特定模板为 @FullName< /strong> 然后可以用不同的名称来调用它。

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

Here's a different approach, that does away for the need for the xsl:choose element. Instead, you could take advantage of the matching templates to have specific templates for the cases of attributes who names you want to override, and a generic template for other case.

To avoid repetition of code, you could also make the generic template a named template, with a parameter to override the name

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

So, the default for most attributes would be to use the attribute name, but the specific template for @FullName could then call this with a different name.

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

Here is the full 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>

When applied to the following XML:

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

The following is output:

<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>
慢慢从新开始 2025-01-15 04:56:29

这是我想出的解决方案。

<?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>

This is the solution I came up with.

<?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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文