根据XSLT 1.0中的值删除重复元素

时间:2014-08-01 19:35:55

标签: xslt xslt-1.0

我已经做了更多关于删除重复元素的研究。 大多数地方,他们使用具有已定义元素名称的关键函数。 就我而言,我没有任何已定义的元素。 我试图修改示例

输入XML:

<Test>
<Req>
  Test
  <A name="Test">Inp1</A>
  <B>Inp2</B>
  <D>Inp3</D>
</Req>
<Resp>
  <A name="Test222">Inp1</A>
  <A>Out1</A>
  <B>Inp1</B>
  <B>Inp2</B>
  <C>Inp3</C>
</Resp>
</Test>

XSL :(我在参考了很多例子之后尝试过。)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="unique" match="/Test" use="*"/>
<xsl:template match="/">
    <xsl:for-each select="key('unique',//*)">
        <xsl:if test="generate-id() = generate-id(key('unique',.)[1])">
            <xsl:copy-of select="."/>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

预期产出:

<Test>
 <Req>
  Test
  <A name="Test">Inp1</A>
  <B>Inp2</B>
  <D>Inp3</D>
</Req>
<Resp>
  <A>Out1</A> 
  <B>Inp1</B> <!-- Inp1 is already available for <A>. Not for <B>. Should not remove this -->
  <C>Inp3</C> <!-- Inp3 is already available for <D>. Not for <C>. Should not remove this -->
</Resp>
</Test>

我们有匹配元素名称和值。 (我们必须忽略这个属性)。

仅在XSLT 1.0或1.1上需要解决方案

对此表示感谢。谢谢:)

1 个答案:

答案 0 :(得分:1)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="unique" match="Req/* | Resp/*" use="concat(local-name(), '|', .)"/>

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

<xsl:template match="Req/* | Resp/*">
    <xsl:if test="generate-id() = generate-id(key('unique', concat(local-name(), '|', .))[1])">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入

<Test>
<Req>
  Test
  <A name="Test">Inp1</A>
  <B>Inp2</B>
  <D>Inp3</D>
</Req>
<Resp>
  <A name="Test222">Inp1</A>
  <A>Out1</A>
  <B>Inp1</B>
  <B>Inp2</B>
  <C>Inp3</C>
</Resp>
</Test>

结果是:

<?xml version="1.0" encoding="UTF-8"?>
<Test>
   <Req>
  Test
  <A name="Test">Inp1</A>
      <B>Inp2</B>
      <D>Inp3</D>
   </Req>
   <Resp>
      <A>Out1</A>
      <B>Inp1</B>
      <C>Inp3</C>
   </Resp>
</Test>