根据同一元素的第二个属性的值更改属性的值
Changing the value of an attribute depending of the value of a second attribute of the same element
这是我的 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 个模板(第一个是身份模板;第二个将 "eat up" 所有 @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>
XSLT:
<?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>
输出:
<?xml version="1.0" encoding="utf-8"?>
<root>
<trans>
<language lang="DE" type="German" />
</trans>
<trans>
<language lang="EN" type="English" />
</trans>
</root>
如果只有三种语言,而您只在一个地方使用此翻译,那么 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>
随着语言的增多,and/or如果您需要在多个地方重用代码,切换到查找可能会更方便:
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>
这是我的 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 个模板(第一个是身份模板;第二个将 "eat up" 所有 @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>
XSLT:
<?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>
输出:
<?xml version="1.0" encoding="utf-8"?>
<root>
<trans>
<language lang="DE" type="German" />
</trans>
<trans>
<language lang="EN" type="English" />
</trans>
</root>
如果只有三种语言,而您只在一个地方使用此翻译,那么 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>
随着语言的增多,and/or如果您需要在多个地方重用代码,切换到查找可能会更方便:
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>