首页 > 解决方案 > 使用 xslt 将兄弟节点设置为 xml 中的父节点

问题描述

我需要使用 xslt 将以下输入 xml 转换为所需的输出格式,如下所示,如何使用 xslt 将 <BTAT_MEASUREMENTSet> 设置为所需输出的父级?,它总是在消息的第二级之后根,因此与根的相对位置是恒定的

**Input:**

    <?xml version="1.0" encoding="UTF-8"?>
<SyncBTAT_MEASUREMENT
    xmlns="http://www.llll.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2021-03-24T15:39:55+00:00" transLanguage="EN" baseLanguage="EN" messageID="176416166003958143562">
    <BTAT_MEASUREMENTSet></BTAT_MEASUREMENTSet>
    <MEASUREPOINT action="AddChange">
        <BTATMBO>MEASUREMENT</BTATMBO>
        <ORGID>TAL3-DE</ORGID>
        <POINTNUM>TEMP</POINTNUM>
        <SITEID>TAL3</SITEID>
        <MEASUREMENT>
            <ASSETNUM>2403871\PPC</ASSETNUM>
            <MEASUREDATE>2020-06-16T06:47:07+00:00</MEASUREDATE>
            <MEASUREMENTID/>
            <MEASUREMENTVALUE>20.0</MEASUREMENTVALUE>
            <METERNAME>TIME-MIN-001</METERNAME>
        </MEASUREMENT>
    </MEASUREPOINT>
</SyncBTAT_MEASUREMENT>

**Needed Output:**

    <?xml version="1.0" encoding="UTF-8"?>
<SyncBTAT_MEASUREMENT
    xmlns="http://www.llll.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2021-03-24T15:39:55+00:00" transLanguage="EN" baseLanguage="EN" messageID="176416166003958143562">
 <BTAT_MEASUREMENTSet>
    <MEASUREPOINT action="AddChange">
        <BTATMBO>MEASUREMENT</BTATMBO>
        <ORGID>TAL3-DE</ORGID>
        <POINTNUM>TEMP</POINTNUM>
        <SITEID>TAL3</SITEID>
        <MEASUREMENT>
            <ASSETNUM>2403871\PPC</ASSETNUM>
            <MEASUREDATE>2020-06-16T06:47:07+00:00</MEASUREDATE>
            <MEASUREMENTID/>
            <MEASUREMENTVALUE>20.0</MEASUREMENTVALUE>
            <METERNAME>TIME-MIN-001</METERNAME>
        </MEASUREMENT>
    </MEASUREPOINT>
  </BTAT_MEASUREMENTSet>
</SyncBTAT_MEASUREMENT>

标签: xmlxsltxpathintegration

解决方案


如果您知道要成为父元素的元素的名称以 开头BTAT_,并且它没有名称也以 开头的兄弟元素BTAT_,那么您可以这样做:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="*[starts-with(local-name(), 'BTAT')]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="../* except self::*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这是假设您不知道输入 XML 中任何元素的名称,包括。根元素 - 否则它可能更简单。


推荐阅读