Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-基于其他属性的值复制某些属性_Xml_Xslt_Xpath_Attributes_Transformation - Fatal编程技术网

Xml XSLT-基于其他属性的值复制某些属性

Xml XSLT-基于其他属性的值复制某些属性,xml,xslt,xpath,attributes,transformation,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'/> <

我有以下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 of lang=french | german | norwegian元素与@source of 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>

非常感谢您的帮助。

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

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

既然你已经接受了一个答案,但没有展示你的尝试,我将继续添加这个基于我的评论的替代方案

XSLT1.0


Fiddle:

你到底在哪里?如果你不知道从哪里开始,从一开始,使用@target添加一个匹配语言,添加一个模板匹配语言[@source],该语言输出语言元素并将模板应用于当前属性以及匹配键“lang”和@source/@*的属性。您可能还需要添加一个与需要剥离的内容匹配的空模板language[@target]| language[@target]/@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>
<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>