如何在XSLT中动态定义属性名称?

时间:2014-11-09 16:03:23

标签: xslt

我有这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">

<xsl:param name="navigation-xml">
    <item id="home"         title-en="Services"     title-de="Leistungen" />
    <item id="company"      title-en="Company"      title-de="Unternehmen" />
    <item id="references"   title-en="References"   title-de="Referenzen" />
</xsl:param>

<xsl:param name="navigation" select="exsl:node-set($navigation-xml)/*" />
<xsl:param name="navigation-id" />

<xsl:template name="title">
    <xsl:apply-templates select="$navigation" mode="title" />
</xsl:template>

<xsl:template match="item" mode="title">
  <xsl:if test="$navigation-id = @id">
      <xsl:choose>
          <xsl:when test="$current-language = 'de'">
              <xsl:value-of select="@title-de" />
          </xsl:when>
          <xsl:otherwise>
              <xsl:value-of select="@title-en" />
          </xsl:otherwise>  
      </xsl:choose> 
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

如何重构最后12行,以便动态确定属性名称(@title-de@title-en),而不是以我所做的(愚蠢)方式确定?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你可以写

<xsl:template name="title">
    <xsl:apply-templates select="$navigation" mode="title" />
</xsl:template>

<xsl:template match="item" mode="title">
  <xsl:if test="$navigation-id = @id">
      <xsl:choose>
          <xsl:when test="$current-language = 'de'">
              <xsl:value-of select="@title-de" />
          </xsl:when>
          <xsl:otherwise>
              <xsl:value-of select="@title-en" />
          </xsl:otherwise>  
      </xsl:choose> 
    </xsl:if>
</xsl:template>

作为

<xsl:template name="title">
    <xsl:apply-templates select="$navigation[$navigation-id = @id]" mode="title" />
</xsl:template>

<xsl:template match="item" mode="title">
  <xsl:value-of select="@*[local-name() = concat('title-', $current-language)]" />
</xsl:template>

答案 1 :(得分:1)

恕我直言,你的问题开始的时间要早​​得多。如果您将navigation-xml参数定义为:

<xsl:param name="navigation-xml">
    <item id="home">
        <title lang="en">Services</title>
        <title lang="de">Leistungen</title>
    </item> 
    <item id="company">
        <title lang="en">Company</title>
        <title lang="de">Unternehmen</title>
    </item> 
    <item id="references">
        <title lang="en">References</title>
        <title lang="de">Referenzen</title>
    </item> 
</xsl:param>

您将能够更方便,更优雅地处理其各个节点。