XSLT-根据其他属性的值复制某些属性
XSLT- Copying certain attributes based on the value of other attributes
我有以下 XML 样本:
<?xml version="1.0" encoding="UTF-8"?>
<languages>
<language lang='english' source='1'/>
<language lang='english' source='2'/>
<language lang='french' target='1' new1-fr='56' new2-fr='66'/>
<language lang='german' target='1' new1-ger='20' new2-ger='21'/>
<language lang='norwegian' target='2' new3-no='76' new2-no='15'/>
<language lang='norwegian' target='1' new1-no='30'></language>
<language lang='german' target='2' new1-ger='23' new2-ger='24' new3-ger='25'/>
</languages>
我想做的是:
当语言元素的@target(@lang=french|german|norwegian)与语言的@source(@lang=[=20=)相同时,复制它们的属性(都以'new'开头)作为元素语言的属性 lang='english'
它应该是这样的:
<languages>
<language lang='english' source='1' new1-fr='56' new2-fr='66' new1-ger='20' new2-ger='21' new1-no='30'/>
<language lang='english' source='2' new3-no='76' new2-no='15' new1-ger='23' new2-ger='24' new3-ger='25'/>
</languages>
非常感谢您的帮助。
您可以使用以下模板。第一个只负责复制根节点
<xsl:template match="languages">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
第二个匹配所有具有 @source
属性的 language
元素。然后它复制元素本身,然后复制源元素的所有属性和 language
元素的所需属性,其 @target
属性等于 $src
变量 - 不包括具有名称的属性lang
和 target
.
<xsl:template match="language[@source]">
<xsl:variable name="src" select="@source" />
<xsl:copy>
<xsl:copy-of select="@* | ../language[@target=$src]/@*[not(local-name(.) ='target') and not(local-name(.) ='lang')]"/>
</xsl:copy>
</xsl:template>
由于您已经接受了一个答案而没有显示您的尝试,我将继续添加这个基于我的评论的备选方案...
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="lang" match="language" use="@target"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="language[@source]">
<xsl:copy>
<xsl:apply-templates select="@*|key('lang',@source)/@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="language[@target]|language[@target]/@lang|@target"/>
</xsl:stylesheet>
我有以下 XML 样本:
<?xml version="1.0" encoding="UTF-8"?>
<languages>
<language lang='english' source='1'/>
<language lang='english' source='2'/>
<language lang='french' target='1' new1-fr='56' new2-fr='66'/>
<language lang='german' target='1' new1-ger='20' new2-ger='21'/>
<language lang='norwegian' target='2' new3-no='76' new2-no='15'/>
<language lang='norwegian' target='1' new1-no='30'></language>
<language lang='german' target='2' new1-ger='23' new2-ger='24' new3-ger='25'/>
</languages>
我想做的是: 当语言元素的@target(@lang=french|german|norwegian)与语言的@source(@lang=[=20=)相同时,复制它们的属性(都以'new'开头)作为元素语言的属性 lang='english'
它应该是这样的:
<languages>
<language lang='english' source='1' new1-fr='56' new2-fr='66' new1-ger='20' new2-ger='21' new1-no='30'/>
<language lang='english' source='2' new3-no='76' new2-no='15' new1-ger='23' new2-ger='24' new3-ger='25'/>
</languages>
非常感谢您的帮助。
您可以使用以下模板。第一个只负责复制根节点
<xsl:template match="languages">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
第二个匹配所有具有 @source
属性的 language
元素。然后它复制元素本身,然后复制源元素的所有属性和 language
元素的所需属性,其 @target
属性等于 $src
变量 - 不包括具有名称的属性lang
和 target
.
<xsl:template match="language[@source]">
<xsl:variable name="src" select="@source" />
<xsl:copy>
<xsl:copy-of select="@* | ../language[@target=$src]/@*[not(local-name(.) ='target') and not(local-name(.) ='lang')]"/>
</xsl:copy>
</xsl:template>
由于您已经接受了一个答案而没有显示您的尝试,我将继续添加这个基于我的评论的备选方案...
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="lang" match="language" use="@target"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="language[@source]">
<xsl:copy>
<xsl:apply-templates select="@*|key('lang',@source)/@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="language[@target]|language[@target]/@lang|@target"/>
</xsl:stylesheet>