我有一个样式表,用于根据其他元素的值删除某些元素。但是,它不起作用......
示例输入XML
<Model>
<Year>1999</Year>
<Operation>ABC</Operation>
<Text>Testing</Text>
<Status>Ok</Status>
</Model>
如果Operation值为'ABC',则从XML中删除Text和Status节点。 并给出以下输出。
<Model>
<Year>1999</Year>
<Operation>ABC</Operation>
</Model>
这是我正在使用的样式表,但它正在从所有XML中删除Text和Status节点,即使操作不是'ABC'。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="ID" select="//Operation"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Text | Status">
<xsl:if test ="$ID ='ABC'">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
先谢谢
如果存在名称空间
,我将如何做同样的事情<ns0:next type="Sale" xmlns:ns0="http://Test.Schemas.Inside_Sales">
答案 0 :(得分:4)
按如下方式更改xsl:if
:
<xsl:if test="../Operation!='ABC'">
你可以摆脱xsl:variable
。
答案 1 :(得分:4)
以下是完整的XSLT转换 - 简短(无变量,无xsl:if
,xsl:choose
,xsl:when
,xsl:otherwise
) :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"*[Operation='ABC']/Text | *[Operation='ABC']/Status"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Model>
<Year>1999</Year>
<Operation>ABC</Operation>
<Text>Testing</Text>
<Status>Ok</Status>
</Model>
产生了想要的正确结果:
<Model>
<Year>1999</Year>
<Operation>ABC</Operation>
</Model>
答案 2 :(得分:3)
XSLT中比使用<xsl:if>
更好的模式是添加具有匹配条件的新模板:
<xsl:template match="(Text | Status)[../Operation != 'ABC']"/>
答案 3 :(得分:2)
我发现这有效:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Model">
<xsl:choose>
<xsl:when test="Operation[text()!='ABC']">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="Year"/>
<xsl:apply-templates select="Operation"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>