基于祖子节点的检测创建新节点

时间:2015-11-18 22:28:24

标签: xml xslt xslt-2.0

任何人都可以帮我解决以下要求。 如果发布者/ catalog / cd11 / year可用/存在,则需要创建具有值的新元素作为publisher / catalog / cd22 ='New Release'

先谢谢

INPUT XML:

<publisher>
    <Name id="d123">
        <Location>Chicago</Location>
    </Name>
    <catalogue id="d1" >
        <cd11 id="d2">
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <year>1985</year>
        </cd11>
    </catalogue>
    <catalogue id="d3" >
        <cd11 id="d4">
            <title>Jurassic World</title>
            <artist>Chris Pratt</artist>
        </cd11>
    </catalogue>    
</publisher>

变换:如果发布者/目录/ cd11路径中存在'year'元素,则应创建<cd22>New Release</cd22>

OUTPUT XML:

<publisher>
    <Name id="d123">
        <Location>Chicago</Location>
    </Name>
    <catalogue id="d1" >
        <cd11 id="d2">
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <year>1985</year>
        </cd11>
        <cd22>New Release</cd22>
    </catalogue>
    <catalogue id="d3" >
        <cd11 id="d4">
            <title>Jurassic World</title>
            <artist>Chris Pratt</artist>
        </cd11>
    </catalogue>    
</publisher>

1 个答案:

答案 0 :(得分:0)

只需使用identity transform,然后覆盖(匹配)具有后代catalogue的所有cd11/year元素。

在我的示例中,我检查year是否为空,但如果重要,您可以更改它。

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="catalogue[string(cd11/year)]">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      <cd22>New Release</cd22>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>