XSLT:仅复制某些节点

时间:2014-04-03 12:40:37

标签: xml sorting xslt copy filtering

你能告诉我如何使用XSLT执行此操作吗?

输入:

<?xml version="1.0"?>
<A>
  <BB bb1="bb1" />
  <CC cc1="cc1" />
  <DD name="name1">
    <EEE type="foo" value="50">
      <FFFF id="id1">
    </EEE>
  </DD>
  <DD name="name2">
    <EEE type="bar" value="50">
      <FFFF id="id2">
    </EEE>
  </DD>
  <DD name="name3">
    <EEE type="foo" value="40">
      <FFFF id="id3">
    </EEE>
  </DD>

输出:

<?xml version="1.0"?>
<A>
  <BB bb1="bb1" />
  <CC cc1="cc1" />
  <DD name="name3">
    <EEE type="foo" value="40">
      <FFFF id="id3">
    </EEE>
  </DD>
  <DD name="name1">
    <EEE type="foo" value="50">
      <FFFF id="id1">
    </EEE>
  </DD>

即。复制所有,除非它是DD,只有在EEE / @ type =“foo”时复制,并按EEE / @值对所有DD进行排序。

现在我刚刚找到xsl代码来复制所有内容并按EEE / @类型排序。

XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()">
        <xsl:sort select="EEE/@type" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

这已经足够好但我真的只想保留那些在EEE / @ type = foo的DD。

非常感谢你。

2 个答案:

答案 0 :(得分:1)

尝试使用xpath选择所需的节点

这应该只复制EEE&#39;属性类型= foo

的元素
<xsl:template match="//EEE[@type='foo']">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

答案 1 :(得分:1)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()">
        <xsl:sort select="EEE/@type" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

你只需要添加一个模板

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()">
        <xsl:sort select="EEE/@type" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="DD[not(EEE/@type = 'foo')]"/>

确保不会复制DD不等于EEE/@type的{​​{1}}元素。