我想要一些技巧来完成反向结构:
XML
已被编辑,太大而无法在此处发布
您可以在下面看到的输入是Header
和Body
,body
有EvenList
,ObjectEvent
和AggregationEvent
输入XML:
<Document>
<Header />
<Body>
<EventList>
--> <ObjectEvent>
--> <eventTime>2018-09-06T08:51:24Z</eventTime>
--> </ObjectEvent>
<AggregationEvent>
<eventTime>2018-09-06T08:51:24Z</eventTime>
</AggregationEvent>
<AggregationEvent>
<eventTime>2018-09-06T08:51:24Z</eventTime>
</AggregationEvent>
<AggregationEvent>
<eventTime>2018-09-06T08:51:24Z</eventTime>
</AggregationEvent>
</EventList>
</Body>
</Document>
预期的输出XML
-XSLT
程序需要将ObjectEvent
的位置反转到最后一个AggregationEvent
。
<Document>
<Header />
<Body>
<EventList>
<AggregationEvent>
<eventTime>2018-09-06T08:51:25Z</eventTime>
</AggregationEvent>
<AggregationEvent>
<eventTime>2018-09-06T08:51:25Z</eventTime>
</AggregationEvent>
--> <ObjectEvent>
--> <eventTime>2018-09-06T08:51:24Z</eventTime>
--> </ObjectEvent>
</EventList>
</Body>
</Document>
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="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="//AggregationEvent">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
谢谢您的投入。
此致
答案 0 :(得分:0)
您使用身份模板以正确的方式开始。不过,您应该在另一个模板上执行的操作是在父EventList
上进行匹配,然后按照您喜欢的顺序选择子节点。
尝试使用此XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="EventList">
<xsl:copy>
<xsl:apply-templates select="AggregationEvent" />
<xsl:apply-templates select="ObjectEvent" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,如果您使用的是XSLT 2.0,则可以通过以下操作将两个xsl:apply-templates
简化为一个:
<xsl:apply-templates select="AggregationEvent, ObjectEvent" />
如果您使用的是XSLT 3.0,则可以用此替换身份模板...
<xsl:mode on-no-match="shallow-copy"/>