任何人都可以帮我解决以下要求。 如果发布者/ 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>
答案 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>