我想要一些提示来完成反向结构:
编辑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>
感谢您的投入。
问候,
您通过使用身份模板以正确的方式开始。你应该在另一个模板上做什么,但在父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"/>