根据同一元素的第二个属性的值更改属性的值

时间:2015-05-20 22:34:37

标签: xml xslt xpath xslt-2.0

这是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <trans>
       <language type="lang" lang="DE"/>
    </trans>
    <trans>
       <language type="lang" lang="EN"/>
    </trans>
</root>

我的目标是根据“lang”属性中指定的值替换属性“type”的值。

这是所需的输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <trans>
       <language type="German" lang="DE"/>
    </trans>
    <trans>
       <language type="English" lang="EN"/>
    </trans>
</root>

我已从以下开始,但此时不再进一步:

   <xsl:template match="language">
    <xsl:choose>
     <xsl:when test="@lang=DE">
       <xsl:attribute name="type">
         <xsl:value-of select="'German'"/>
   <xsl:apply-templates/>
     </xsl:when>
    <xsl:otherwise>
    ???

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:1)

尝试这3个模板(第一个是身份模板;第二个将“吃掉”所有@type;第三个将根据@type再次生成两个属性:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="//language/@type"/>

<xsl:template match="//language/@lang">
  <xsl:attribute name="lang">
    <xsl:value-of select="."/>
  </xsl:attribute>
  <xsl:attribute name="type">
    <xsl:choose>
      <xsl:when test=".='DE'">German</xsl:when>
      <xsl:when test=".='EN'">English</xsl:when>
      <xsl:otherwise>Other</xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
</xsl:template>

答案 1 :(得分:1)

XSLT:

[HttpGet]
public ActionResult Login()
{
    if (Session["ContactName"] != null)
    {
        return RedirectToAction("Index", "Home");
    }
    else
    {
        return View();
    }
}

输出:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:data="data">
  <xsl:output method="xml" indent="yes"/>
  <data:languages>
    <lang key="DE" value="German"/>
    <lang key="EN" value="English"/>
  </data:languages>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="language">
    <xsl:copy>
      <xsl:apply-templates select="@*[name() != 'type']"/>
      <xsl:attribute name="type">
        <xsl:value-of select="document('')//lang[@key = current()/@lang]/@value"/>
      </xsl:attribute>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

如果只有三种语言,并且您只在一个地方使用此翻译,则xsl:choose会成为一个有吸引力的选择。当然,它可以简单地实现为:

XSLT 1.0或2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="language/@type">
    <xsl:attribute name="type">
        <xsl:choose>
            <xsl:when test="../@lang='DE'">German</xsl:when>
            <xsl:when test="../@lang='EN'">English</xsl:when>
            <xsl:when test="../@lang='FR'">French</xsl:when>
        </xsl:choose>
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

使用更多语言,和/或如果您需要在多个地方重用代码,切换到查找可能更方便:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:variable name="languages">
    <language code="DE">German</language>
    <language code="EN">English</language>
    <language code="FR">French</language>
</xsl:variable>

<xsl:key name="lang" match="language" use="@code" />

<xsl:template match="language/@type">
    <xsl:attribute name="type">
        <xsl:value-of select="key('lang', ../@lang, $languages)"/>
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>