Xml 用于不同节点和元素的XSLT 1.0分组键
我在看明钦族。我试图找到与我的xml相似的示例,但找不到任何示例。大多数示例结构良好,而我的示例令人困惑 这里是我的XML的一个简短版本(请注意,我不能更改XML结构,因为它是标准的,不在我的掌握之中),我使用XSLT1,因为系统现在只支持该版本Xml 用于不同节点和元素的XSLT 1.0分组键,xml,xslt,grouping,xslkey,Xml,Xslt,Grouping,Xslkey,我在看明钦族。我试图找到与我的xml相似的示例,但找不到任何示例。大多数示例结构良好,而我的示例令人困惑 这里是我的XML的一个简短版本(请注意,我不能更改XML结构,因为它是标准的,不在我的掌握之中),我使用XSLT1,因为系统现在只支持该版本 <object> <creator id="123"> <name>ABC</name> <city>Hamilton</city>
<object>
<creator id="123">
<name>ABC</name>
<city>Hamilton</city>
</creator>
<creator><references>456</references></creator>
<contact><references>123</references></contact>
<creator id="456">
<name>XYZ</name>
<city>New York</city>
</creator>
<associatedParty><references>123</references>
<role>Sponsor</role>
</associatedParty>
</object>
基础知识
汉密尔顿
456
123
XYZ
纽约
123
赞助商
我想要的输出是:
<party id="123">
<name>ABC</name>
<city>Hamilton</city>
<role>Creator</role>
<role>Contact</role>
<role>Sponsor</role>
</party>
<party id="456">
<name>XYZ</name>
<city>New York</city>
<role>Creator</role>
<role>Contact</role>
</party>
基础知识
汉密尔顿
造物主
接触
赞助商
XYZ
纽约
造物主
接触
现在id属性被用作references元素的值。输出中的标记可以是creator、contact或元素内部的任何东西(如果它位于associatedParty元素下)
我一直在创建密钥,以便根据它们的id/references属性对它们进行分组。就我所见,使用xsl:key的示例仅适用于具有相同名称的节点,而我发布的示例具有不同的节点名称。任何帮助都将不胜感激 此转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kRefByVal" match="references"
use="."/>
<xsl:key name="kCreatorById" match="creator"
use="@id"/>
<xsl:key name="kRoleNameByRef"
match="*[not(self::associatedParty
or
self::creator
)
]"
use="references"/>
<xsl:key name="kAssocByRef"
match="associatedParty"
use="references"/>
<xsl:template match="/">
<xsl:variable name="vReferences" select=
"*/*/references
[generate-id()
=
generate-id(key('kRefByVal',.)[1])
]
"/>
<xsl:apply-templates select="$vReferences">
<xsl:sort select="." data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="references" priority="3">
<party id="{.}">
<xsl:copy-of select="key('kCreatorById',.)/*"/>
<xsl:apply-templates select=
"key('kCreatorById',.)"/>
<xsl:apply-templates select=
"key('kRoleNameByRef',.)"/>
<xsl:copy-of select="key('kAssocByRef',.)/role"/>
</party>
</xsl:template>
<xsl:template match="*[not(self::associatedParty)]">
<role>
<xsl:value-of select="name()"/>
</role>
</xsl:template>
</xsl:stylesheet>
<object>
<creator id="123">
<name>ABC</name>
<city>Hamilton</city>
</creator>
<creator>
<references>456</references>
</creator>
<contact>
<references>123</references>
</contact>
<creator id="456">
<name>XYZ</name>
<city>New York</city>
</creator>
<associatedParty>
<references>123</references>
<role>Sponsor</role>
</associatedParty>
</object>
<party id="123">
<name>ABC</name>
<city>Hamilton</city>
<role>creator</role>
<role>contact</role>
<role>Sponsor</role>
</party>
<party id="456">
<name>XYZ</name>
<city>New York</city>
<role>creator</role>
</party>
应用于提供的XML文档时:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kRefByVal" match="references"
use="."/>
<xsl:key name="kCreatorById" match="creator"
use="@id"/>
<xsl:key name="kRoleNameByRef"
match="*[not(self::associatedParty
or
self::creator
)
]"
use="references"/>
<xsl:key name="kAssocByRef"
match="associatedParty"
use="references"/>
<xsl:template match="/">
<xsl:variable name="vReferences" select=
"*/*/references
[generate-id()
=
generate-id(key('kRefByVal',.)[1])
]
"/>
<xsl:apply-templates select="$vReferences">
<xsl:sort select="." data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="references" priority="3">
<party id="{.}">
<xsl:copy-of select="key('kCreatorById',.)/*"/>
<xsl:apply-templates select=
"key('kCreatorById',.)"/>
<xsl:apply-templates select=
"key('kRoleNameByRef',.)"/>
<xsl:copy-of select="key('kAssocByRef',.)/role"/>
</party>
</xsl:template>
<xsl:template match="*[not(self::associatedParty)]">
<role>
<xsl:value-of select="name()"/>
</role>
</xsl:template>
</xsl:stylesheet>
<object>
<creator id="123">
<name>ABC</name>
<city>Hamilton</city>
</creator>
<creator>
<references>456</references>
</creator>
<contact>
<references>123</references>
</contact>
<creator id="456">
<name>XYZ</name>
<city>New York</city>
</creator>
<associatedParty>
<references>123</references>
<role>Sponsor</role>
</associatedParty>
</object>
<party id="123">
<name>ABC</name>
<city>Hamilton</city>
<role>creator</role>
<role>contact</role>
<role>Sponsor</role>
</party>
<party id="456">
<name>XYZ</name>
<city>New York</city>
<role>creator</role>
</party>
基础知识
汉密尔顿
456
123
XYZ
纽约
123
赞助商
生成所需的正确结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kRefByVal" match="references"
use="."/>
<xsl:key name="kCreatorById" match="creator"
use="@id"/>
<xsl:key name="kRoleNameByRef"
match="*[not(self::associatedParty
or
self::creator
)
]"
use="references"/>
<xsl:key name="kAssocByRef"
match="associatedParty"
use="references"/>
<xsl:template match="/">
<xsl:variable name="vReferences" select=
"*/*/references
[generate-id()
=
generate-id(key('kRefByVal',.)[1])
]
"/>
<xsl:apply-templates select="$vReferences">
<xsl:sort select="." data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="references" priority="3">
<party id="{.}">
<xsl:copy-of select="key('kCreatorById',.)/*"/>
<xsl:apply-templates select=
"key('kCreatorById',.)"/>
<xsl:apply-templates select=
"key('kRoleNameByRef',.)"/>
<xsl:copy-of select="key('kAssocByRef',.)/role"/>
</party>
</xsl:template>
<xsl:template match="*[not(self::associatedParty)]">
<role>
<xsl:value-of select="name()"/>
</role>
</xsl:template>
</xsl:stylesheet>
<object>
<creator id="123">
<name>ABC</name>
<city>Hamilton</city>
</creator>
<creator>
<references>456</references>
</creator>
<contact>
<references>123</references>
</contact>
<creator id="456">
<name>XYZ</name>
<city>New York</city>
</creator>
<associatedParty>
<references>123</references>
<role>Sponsor</role>
</associatedParty>
</object>
<party id="123">
<name>ABC</name>
<city>Hamilton</city>
<role>creator</role>
<role>contact</role>
<role>Sponsor</role>
</party>
<party id="456">
<name>XYZ</name>
<city>New York</city>
<role>creator</role>
</party>
基础知识
汉密尔顿
造物主
接触
赞助商
XYZ
纽约
造物主
您可以使用此模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="//creator[not(references)]"/>
</xsl:template>
<xsl:template match="creator">
<party id="{@id}">
<xsl:copy-of select="name"/>
<xsl:copy-of select="city"/>
<role>Creator</role>
<xsl:apply-templates select="../*[not(self::creator) and references = current()/@id]"/>
</party>
</xsl:template>
<xsl:template match="associatedParty" priority="1">
<xsl:copy-of select="role"/>
</xsl:template>
<xsl:template match="*[references]">
<role>
<xsl:value-of select="name()"/>
</role>
</xsl:template>
</xsl:stylesheet>
造物主
输出:
<party id="123">
<name>ABC</name>
<city>Hamilton</city>
<role>Creator</role>
<role>contact</role>
<role>Sponsor</role>
</party>
<party id="456">
<name>XYZ</name>
<city>New York</city>
<role>Creator</role>
</party>
基础知识
汉密尔顿
造物主
接触
赞助商
XYZ
纽约
造物主
问得好,+1。有关完整的解决方案,请参阅我的答案。感谢您的回答:)!!!!虽然我还没有完全理解它们的真正含义,但谢谢你的回答!它也起作用了!我想知道是否有人能概述这两种方法。如果其中一个性能比另一个好。