如果另一个节点不存在,则将节点添加到XML中

时间:2014-04-03 20:13:06

标签: xslt-2.0

我是XSLT的新手,正致力于从一个XML转换到另一个XML并面临以下问题

如果存在Book 1节点,那么我不应该将Book 2节点看成转换后的XML。我试过不同的短语,但不起作用。

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Catalog>
  <book1>Wise Otherwise</book1>
  <book2>Great Expectations</book2>>
</Catalog>

预期的XML                  明智不然
    

以下是我的XSL

<?xml version="1.0" encoding="UTF-8"?>

    

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

<xsl:if test="book1">
    <xsl:template match="book2" />
</xsl:if>

<xsl:if test="not(book1)">
    <xsl:template match="book2">
    <book2>
        <xsl:apply-templates />
    </book2>
</xsl:template>
</xsl:if>   
</xsl:stylesheet>

我甚至尝试过xsl:选择

<xsl:choose>
<xsl:when test="/catalog/book1">
     <xsl:template match="book2" />
</xsl:when>
<!-- more xsl:when here, if needed -->
<xsl:otherwise>
     <xsl:template match="book2">
    <book2>
        <xsl:apply-templates />
    </book2>
    </xsl:template>
</xsl:otherwise>
</xsl:choose>

Book1和Book2是从变换后的xml中互斥的。

当且仅当Book1不在输入XML中时,

Book2应该是转换后的XML。

我希望这会给你更好的照片

由于

1 个答案:

答案 0 :(得分:1)

使用带有身份转换模板的样式表

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

和模板<xsl:template match="Catalog[Book-1]/Book-2"/>

根据您提供的XML示例,

是完整的XSLT样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

<xsl:template match="Catalog[book1]/book2"/>

</xsl:stylesheet>

转换

<Catalog>
  <book1>Wise Otherwise</book1>
  <book2>Great Expectations</book2>
</Catalog>

<Catalog>
  <book1>Wise Otherwise</book1>

</Catalog>