根据其他元素的值删除元素 - XSLT

时间:2012-05-16 23:59:15

标签: xslt nodes

我有一个样式表,用于根据其他元素的值删除某些元素。但是,它不起作用......

示例输入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">

4 个答案:

答案 0 :(得分:4)

按如下方式更改xsl:if

<xsl:if test="../Operation!='ABC'">

你可以摆脱xsl:variable

答案 1 :(得分:4)

以下是完整的XSLT转换 - 简短(无变量,无xsl:ifxsl:choosexsl:whenxsl: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>