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



有人能帮我满足以下要求吗。如果publisher/catalog/cd11/年可用/存在,则需要创建一个有值的新元素,作为publisher/directory/cd22="new Release"

谢谢,提前

输入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>

转换:如果publisher/catalog/cd11路径中存在"year"元素,则应创建<cd22>New Release</cd22>

输出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>

只需使用标识转换,然后覆盖(匹配)所有具有子代cd11/yearcatalogue元素。

在我的示例中,我检查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>

最新更新