【问题标题】:Reverse Structure Position XSLT反向结构位置 XSLT
【发布时间】:2018-09-07 08:03:14
【问题描述】:

我想要一些技巧来完成反向结构:

XML 已编辑,太大,无法在此处发布

如下所示输入有HeaderBodybodyEvenListObjectEventAggregationEvent

输入 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>

感谢您的意见。

问候,

【问题讨论】:

  • ...您当然也有一些 XSLT 可以展示?
  • 我不知道。我刚刚开始我在上面发布的内容。

标签: xml xslt xml-parsing


【解决方案1】:

您以正确的方式开始使用身份模板。您应该在另一个模板上执行的操作是匹配父级 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"/>

【讨论】:

  • 再次提姆,谢谢!它根据需要工作。亲切的问候。
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多