我需要映射以下内容,但很难,因为它有不同的名称:
<main>
<order>
<ID>123</ID>
<Name>ABC</Name>
</order>
<order>
<ID>4556</ID>
<Name>AAA</Name>
<ParentID>123</ParentID>
</order>
</main>
结果应为:
<main>
<order>
<ID>123</ID>
<Name>ABC</Name>
<order>
<ID>4556</ID>
<Name>AAA</Name>
<ParentID>123</ParentID>
</order>
</order>
</main>
答案 0 :(得分:0)
将索引为order
的所有n>1
节点复制到第一个节点的一种方法是以下XSLT:
<?xml version = "1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="text()" /> <!-- suppresses copying of text() nodes -->
<xsl:template match="main"> <!-- replicates the "main" node -->
<main>
<xsl:apply-templates />
</main>
</xsl:template>
<xsl:template match="order[1]"> <!-- matches the first "order" node and copies all following ones -->
<order>
<xsl:copy-of select="*" />
<xsl:copy-of select="following-sibling::order" />
</order>
</xsl:template>
</xsl:stylesheet>
输出如下:
<?xml version="1.0"?>
<main>
<order>
<ID>123</ID>
<Name>ABC</Name>
<order>
<ID>4556</ID>
<Name>AAA</Name>
<ParentID>123</ParentID>
</order>
</order>
</main>
答案 1 :(得分:0)
就像@ michael.hor257k所说的那样,概念上这个问题和你之前的问题是一样的。我想你只是不理解这个概念。希望我的例子中的评论会有所帮助。
如果我正确理解了这个问题,您希望基于order
将order
元素嵌套在其“父”ParentID
元素中。因为我们基于ParentID,所以我们将使用它来代替我们的密钥...
XML输入
<main>
<order>
<ID>123</ID>
<Name>ABC</Name>
</order>
<order>
<ID>4556</ID>
<Name>AAA</Name>
<ParentID>123</ParentID>
</order>
</main>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!--Create a key containing order elements that contain a non-empty ParentID.-->
<xsl:key name="orderByParentId" match="order[string(ParentID)]" use="ParentID"/>
<!--Identity transform (https://www.w3.org/TR/xslt#copying)-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/main">
<xsl:copy>
<!--To get the high level order elements, only apply-templates when order
does not contain a non-empty ParentID child.-->
<xsl:apply-templates
select="@*|order[not(string(ParentID))]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="order">
<xsl:copy>
<!--Don't apply-templates to ParentID; we don't want to keep those.
Do apply-templates to the key 'orderByParentId' when the key matches
the current order's ID child.-->
<xsl:apply-templates
select="@*|*[not(self::ParentID)]|key('orderByParentId',ID)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<main>
<order>
<ID>123</ID>
<Name>ABC</Name>
<order>
<ID>4556</ID>
<Name>AAA</Name>
</order>
</order>
</main>