我是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。
我希望这会给你更好的照片
由于
答案 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>