Xml 略为复杂的xslt muenchian分组

Xml 略为复杂的xslt muenchian分组,xml,xslt,muenchian-grouping,Xml,Xslt,Muenchian Grouping,这里是xslt的另一个新手。我有一个与此类似的问题--但由于额外的一层节点而变得复杂 我有这个XML <ALLDATA> <THIS> <ID>datum 1</ID> <DATA>datarecord1</DATA> <RELATIONSHIPS> <rel> <relid>rd1</relid> <

这里是xslt的另一个新手。我有一个与此类似的问题--但由于额外的一层节点而变得复杂

我有这个XML

<ALLDATA>
  <THIS>
    <ID>datum 1</ID>
    <DATA>datarecord1</DATA>
    <RELATIONSHIPS>
      <rel>
        <relid>rd1</relid>
        <reldata>something</reldata>
      </rel>
    </RELATIONSHIPS>
  </THIS>
  <THIS>
    <ID>datum 1</ID>
    <DATA>datarecord1</DATA>
    <RELATIONSHIPS>
      <rel>
        <relid>rd2</relid>
        <reldata>other</reldata>
      </rel>
    </RELATIONSHIPS>
  </THIS>
  <THIS>
    <ID>rd1</ID>
    <DATA>relrecord1</DATA>
    <RELATIONSHIPS/>
  </THIS>
  <THIS>
    <ID>rd2</ID>
    <DATA>relrecord2</DATA>
    <RELATIONSHIPS/>
  </THIS>
</ALLDATA>

基准1
数据记录1
rd1
某物
基准1
数据记录1
rd2
其他
rd1
relrecord1
rd2
relrecord2
。。。我想把它转换成

<ALLDATA>
  <THIS>
    <ID>datum 1</ID>
    <DATA>datarecord1</DATA>
    <RELATIONSHIPS>
      <rel>
        <relid>rd1</relid>
        <reldata>something</reldata>
      </rel>
      <rel>
        <relid>rd2</relid>
        <reldata>other</reldata>
      </rel>
    </RELATIONSHIPS>
  </THIS>
  <THIS>
    <ID>rd1</ID>
    <DATA>relrecord1</DATA>
    <RELATIONSHIPS/>
  </THIS>
  <THIS>
    <ID>rd2</ID>
    <DATA>relrecord2</DATA>
    <RELATIONSHIPS/>
  </THIS>
</ALLDATA>

基准1
数据记录1
rd1
某物
rd2
其他
rd1
relrecord1
rd2
relrecord2
我正在使用的xslt(1.0)显然离基础太远了,所以我希望有更多知识的人(嗨!)能帮我纠正错误:)

这是无用的xslt

<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="krel" match="THIS" use="ID"/>

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

 <xsl:template match="appex_user/node">
  <xsl:copy>
    <xsl:apply-templates select="THIS[generate-id() = generate-id(key('krel', ID)[1])]" mode="group"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="THIS/RELATIONSHIPS" mode="group">
  <xsl:copy>
   <xsl:copy-of select="RELATIONSHIPS/rel"/>
   <xsl:apply-templates select="key('krel', ID)"/>
  </xsl:copy>
 </xsl:template>

</xsl:stylesheet>


实际上-我尝试了各种组合,但都没有效果。

您的XSLT有一些问题

首先,您有一个匹配“appex_user/node”的模板,它不在您的XML中。您需要在这里匹配根元素“ALLDATA”

其次,在选择distinct
THIS
元素时使用“mode”属性。这并没有什么问题,但是您没有一个模板与同样使用mode的
元素相匹配。这意味着XSLT将使用其默认模板,该模板不会输出
元素,而是继续匹配其子元素。我不认为你真的需要在这种情况下使用“模式”

现在,您确实有一个模板使用模式匹配
关系
,该模式将得到匹配,但当您使用键时,您将使用它与值“ID”一起使用,该值将查找名为
ID
的元素作为当前
关系
节点的子元素。但是
ID
不是孩子。应该使用表达式
。\ID
获取父节点的子节点

试试这个XSLT

<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="krel" match="THIS" use="ID"/>

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

 <xsl:template match="ALLDATA">
  <xsl:copy>
    <xsl:apply-templates select="THIS[generate-id() = generate-id(key('krel', ID)[1])]" />
  </xsl:copy>
 </xsl:template>

 <xsl:template match="THIS/RELATIONSHIPS">
  <xsl:copy>
   <xsl:apply-templates select="key('krel', ../ID)/RELATIONSHIPS/rel"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>


嗯,
match=“appex\u user/node”
与您发布的任何输入都不匹配。为了安全起见,数据不应该也是密钥的一部分吗?即使假定ID和数据是一对一链接的,也可能存在这样一种情况,即这些元素具有相同的ID值,但数据值不同。然后,在键上仅使用ID运行样式表将只使用其中一个数据元素,而所有其他具有不同值的数据元素都将丢失。只是说说而已。啊。。appex_用户位来自原始版本-我调整了我的标签,使其看起来更通用,而不是使用真正的tags.Re。数据标签:是的,你是对的,但在我的情况下,它总是一样的。谢谢蒂姆-看起来不错。下周回去工作的时候我会试一试:)更进一步,我以前的回答是:它很管用。再次感谢!