Xml 略为复杂的xslt muenchian分组
这里是xslt的另一个新手。我有一个与此类似的问题--但由于额外的一层节点而变得复杂 我有这个XMLXml 略为复杂的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> <
<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。数据标签:是的,你是对的,但在我的情况下,它总是一样的。谢谢蒂姆-看起来不错。下周回去工作的时候我会试一试:)更进一步,我以前的回答是:它很管用。再次感谢!