【问题标题】:Removing duplicate elements based on values in XSLT 1.0根据 XSLT 1.0 中的值删除重复元素
【发布时间】:2014-08-01 19:35:54
【问题描述】:

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

输入 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 上需要解决方案

感谢您对此的帮助。谢谢:)

【问题讨论】:

  • 你的key不应该匹配/Test,而是ReqResp的子元素,并且它需要使用元素名称和内容的串联。
  • 我已将'\Test'改为\。仍然出现错误。你能帮我看看示例 XSL。
  • 恐怕您的附加问题不清楚(也许您应该发布一个新问题?)。
  • 不带 XSL 密钥的相同解决方案。
  • 根据您的建议回滚

标签: xslt xslt-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>

【讨论】:

  • 谢谢 Mike :) 这仅适用于子元素。如果我有重复的元素,它不会被删除。我现在已经编辑了请求 XML
  • 我必须删除“Req”和“Resp”下任何位置的重复元素。谢谢:)
  • 我找到了从 Mike's Answer 中删除所有重复元素的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多