如何将属性值分配给xslt 2.0中不同节点中的另一个属性

时间:2015-07-20 21:01:25

标签: xslt

任何人都可以帮我解决以下要求。 id属性值“123”将被分配给节点“cd11”中的属性ref =“123”。提前谢谢

输入XML

<publisher>
    <Name id="123">
        <Location>Chicago</Location>
    </Name>
    <catalogue id="111" >
        <cd11 id="222">
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <year>1985</year>
        </cd11>
    </catalogue>
</publisher>

输出XML

<publisher>
    <Name id="123">
        <Location>Chicago</Location>
    </Name>
    <catalogue id="111" >
        <cd11 id="222" ref="123">
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <year>1985</year>
        </cd11>
    </catalogue>
</publisher>

转换: 在节点“cd11”中创建一个新属性“ref”,属性@ Name / id将分配给@ cd11 / ref

2 个答案:

答案 0 :(得分:1)

这是一种可能的方式:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="catalogue/cd11">
      <xsl:copy>
        <xsl:attribute name="ref">
          <xsl:value-of select="parent::catalogue/preceding-sibling::Name/@id"/>
        </xsl:attribute>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
  • <xsl:template match="@* | node()">...:身份模板。此模板将应用它的所有节点和属性复制到输出XML,未更改。

  • <xsl:template match="catalogue/cd11">...:此模板会覆盖<cd11>元素的<catalogue>元素的身份模板。此模板会复制匹配的cd11元素,并创建新属性ref,该值取自{&1;}之前的id属性。 Name元素。

答案 1 :(得分:1)

首先,我想通过@ Name / id和@ cd11 / ref,你的意思是属性&#34; id&#34;元素&#34;名称&#34;和属性&#34; ref&#34;元素&#34; cd11&#34;,分别是Name / @ id和cd11 / @ ref

尝试以下
- 为&#34; cd11&#34;创建一个模板。使用ref属性值的输入参数 - 为&#34;目录&#34;创建模板。元素,并在其中调用模板&#34; cd11&#34;传递ref属性的值,该属性是从兄弟元素&#34; name&#34;中提取的。

...像这样(可能需要在编译之前编辑)

<xsl:stylesheet > 
 <!-- ...-->
 <xsl:template match="catalogue" >
   <!--   any other  processing of  catalogue element --> 

     <xsl:element name="catalogue">
        <xsl:attribute name="id" select="./@id"

       <!--  call the  cd11 template --> 
       <xsl:apply-templates select="./cd11">
          <xsl:param name="pRef" select="../name[1]/@id"
       </xsl:apply-templates>

     </xsl:element>
 </xsl:template>

<xsl:template match="cd11" >
    <xsl:param name="pRef" />

    <xsl:element name="cd11" >
        <xsl:attribute name="id" select="./@id"/>
        <xsl:attribute name="ref" select="$pRef"/>
       <!-- copy  the body of the element--> 
        <xsl:copy-of select= "./*"/>
   </xsl:element>
 </xsl:template>


<!-- ...-->

</xsl:stylesheet>

希望它成功。