XSLT-根据其他属性的值复制某些属性

时间:2019-02-15 13:15:06

标签: xml xslt xpath attributes transformation

我有以下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 ='english)'相同时,将其属性(均以'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>

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

由于您已经接受了答案但未显示尝试的内容,因此我将继续添加基于我的评论的替代方法...

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>

提琴:http://xsltfiddle.liberty-development.net/gWvjQf2

答案 1 :(得分:0)

您可以使用以下模板。第一个只负责复制根节点

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

第二个匹配所有具有language属性的@source元素。然后,它会复制元素本身,然后再从源元素复制所有属性,并复制其language属性等于@target的{​​{1}}元素的所需属性-排除具有名称的属性$srclang

target