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>
实际上 - 我尝试了各种各样的组合无济于事。
答案 0 :(得分:0)
您的XSLT存在一些问题
首先,您有一个匹配“appex_user / node”的模板,该模板不在您的XML中。您需要在此处匹配根元素“ALLDATA”。
其次,在选择不同的THIS
元素时使用“mode”属性。这没有什么不对,但是你没有匹配同样使用模式的THIS
元素的模板。这意味着XSLT将使用其默认模板,该模板不会输出THIS
元素,而是继续匹配其子元素。在这种情况下,我认为你真的不需要使用“模式”。
现在,你有一个模板匹配RELATIONSHIPS
使用模式,它将匹配,但是当你使用密钥时,你使用值“ID”,它将寻找一个名为{{的元素1}}作为当前ID
节点的子节点。但RELATIONSHIPS
不是孩子。您应该使用表达式ID
来获取父节点的子节点。
试试这个XSLT
..\ID