稍微复杂的xslt muenchian分组

时间:2016-02-25 16:40:35

标签: xml xslt muenchian-grouping

xslt的另一个新人。我有一个类似于这个问题的问题 - Applying Muenchian grouping for a simple XML with 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>

...并希望将其转换为...

<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>

我使用的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>

实际上 - 我尝试了各种各样的组合无济于事。

1 个答案:

答案 0 :(得分:0)

您的XSLT存在一些问题

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

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

现在,你有一个模板匹配RELATIONSHIPS使用模式,它将匹配,但是当你使用密钥时,你使用值“ID”,它将寻找一个名为{{的元素1}}作为当前ID节点的子节点。但RELATIONSHIPS不是孩子。您应该使用表达式ID来获取父节点的子节点。

试试这个XSLT

..\ID