使用 XSLT 基于共同属性组合 2 个不同的 xml 标签
Combine 2 different xml tags based on common attribute using XSLT
我有一个 xml 下面的例子
<Message>
<Person>
<Key>111</Key>
<Name>John</Name>
<Age>20</Age>
</Person>
<Person>
<Key>112</Key>
<Name>Alex</Name>
<Age>20</Age>
</Person>
<Person>
<Key>113</Key>
<Name>Sean</Name>
<Age>20</Age>
</Person>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Camry</Model>
</Car>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
<Car>
<Key>112</Key>
<Make>Honda</Make>
<Model>Civic</Model>
</Car>
<Car>
<Key>113</Key>
<Make>Lexus</Make>
<Model>G300</Model>
</Car>
</Message>
我想使用 xslt 创建一个 xml:
<Message>
<Person>
<Key>111</Key>
<Name>John</Name>
<Age>20</Age>
</Person>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Camry</Model>
</Car>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
</Message>
我想为每个键创建一个消息段,并在其中为每个键创建 <person>
和 <car>
段。我如何使用 xslt 2.0 执行此操作?
<xsl:template match="Message">
<xsl:for-each select="Person[Key = following-sibling::Car/Key]">
<Message>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::Car[Key = current()/Key]"/>
</Message>
</xsl:for-each>
</xsl:template>
Check it
要按照评论中的建议使用 for-each-group
,请使用
<xsl:template match="Message">
<xsl:for-each-group select="*" group-by="Key">
<Message>
<xsl:copy-of select="current-group()"/>
</Message>
</xsl:for-each-group>
</xsl:template>
完整的样式表是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="Message">
<xsl:for-each-group select="*" group-by="Key">
<Message>
<xsl:copy-of select="current-group()"/>
</Message>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
我有一个 xml 下面的例子
<Message>
<Person>
<Key>111</Key>
<Name>John</Name>
<Age>20</Age>
</Person>
<Person>
<Key>112</Key>
<Name>Alex</Name>
<Age>20</Age>
</Person>
<Person>
<Key>113</Key>
<Name>Sean</Name>
<Age>20</Age>
</Person>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Camry</Model>
</Car>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
<Car>
<Key>112</Key>
<Make>Honda</Make>
<Model>Civic</Model>
</Car>
<Car>
<Key>113</Key>
<Make>Lexus</Make>
<Model>G300</Model>
</Car>
</Message>
我想使用 xslt 创建一个 xml:
<Message>
<Person>
<Key>111</Key>
<Name>John</Name>
<Age>20</Age>
</Person>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Camry</Model>
</Car>
<Car>
<Key>111</Key>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
</Message>
我想为每个键创建一个消息段,并在其中为每个键创建 <person>
和 <car>
段。我如何使用 xslt 2.0 执行此操作?
<xsl:template match="Message">
<xsl:for-each select="Person[Key = following-sibling::Car/Key]">
<Message>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::Car[Key = current()/Key]"/>
</Message>
</xsl:for-each>
</xsl:template>
Check it
要按照评论中的建议使用 for-each-group
,请使用
<xsl:template match="Message">
<xsl:for-each-group select="*" group-by="Key">
<Message>
<xsl:copy-of select="current-group()"/>
</Message>
</xsl:for-each-group>
</xsl:template>
完整的样式表是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="Message">
<xsl:for-each-group select="*" group-by="Key">
<Message>
<xsl:copy-of select="current-group()"/>
</Message>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>