首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XSLT重命名XML标记

使用XSLT重命名XML标记
EN

Stack Overflow用户
提问于 2019-07-31 11:26:37
回答 1查看 117关注 0票数 0

我想使用xslt重新构造XML。在输入XML中有?xml-多个标记。

输入

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<jsonObject>
<aaaa>
  <details>
     <name>abc</name>
  </details>
  <approved>true</approved>
</aaaa>
<payload>
  <NICNumber>
     <name>New</name>
     <address>
        <ffff>122</ffff>
        <gggg>true</gggg>
     </address>
     <gccid>1</gccid>
     <?xml-multiple NICNumberAlias?>
     <NICNumberAlias>
        <id>123</id>
     </NICNumberAlias>
     <?xml-multiple managersNICNumber?>
     <managersNICNumber>
        <userId>bbbbee</userId>
     </managersNICNumber>
  </NICNumber>
</payload>
</jsonObject>

XSLT

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
    <jsonArray>
        <xsl:for-each select="jsonObject">
            <jsonObject>
                <xsl:apply-templates select="aaaa"/>
                <payload>
                    <xsl:copy-of select="payload/NICNumber/address" />
                    <xsl:apply-templates select="payload/NICNumber/address" />
                    <xsl:processing-instruction name="xml-multiple">NICNumbers</xsl:processing-instruction>
                    <NICNumbers>
                        <xsl:apply-templates select="payload/NICNumber/child::node()"/>
                    </NICNumbers>
                </payload>
            </jsonObject>
        </xsl:for-each>
    </jsonArray>
</xsl:template>

<xsl:template match="payload/NICNumber/address"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="payload/NICNumber/managersNICNumber">
    <xsl:if test="count(../managersNICNumber)=1">
      <xsl:processing-instruction name="xml-multiple">xxxx</xsl:processing-instruction>
    </xsl:if>
    <xxxx>
        <xsl:apply-templates select="@*|node()" />
    </xxxx>
</xsl:template>


<xsl:template match="payload/NICNumber/NICNumberAlias">
    <xsl:if test="count(../NICNumberAlias)=1">
      <xsl:processing-instruction name="xml-multiple">NICNumberAliases</xsl:processing-instruction>
    </xsl:if>
    <NICNumberAliases>
        <xsl:apply-templates select="@*|node()" />
    </NICNumberAliases>
</xsl:template>

</xsl:stylesheet>

预期结果

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<jsonArray>
<jsonObject>
<aaaa>
    <details>
        <name>abc</name>
    </details>
    <approved>true</approved>
 </aaaa>
  <payload>
     <address>
        <ffff>122</ffff>
        <gggg>true</gggg>
     </address>
     <?xml-multiple NICNumbers?>
     <NICNumbers>
        <name>New</name>
        <gccid>1</gccid>
        <?xml-multiple NICNumberAliases?>
        <NICNumberAliases>
           <id>123</id>
        </NICNumberAliases>
        <?xml-multiple xxxx?>
        <xxxx>
           <userId>bbbbee</userId>
        </xxxx>
     </NICNumbers>
  </payload>
  </jsonObject>
  </jsonArray>

但我收到的回应如下。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<jsonArray>
<jsonObject>
  <aaaa>
    <details>
        <name>abc</name>
    </details>
    <approved>true</approved>
  </aaaa>
  <payload>
     <address>
        <ffff>122</ffff>
        <gggg>true</gggg>
     </address>
     <?xml-multiple NICNumbers?>
     <NICNumbers>
        <name>New</name>
        <gccid>1</gccid>
        <?xml-multiple NICNumberAlias?>
        <?xml-multiple NICNumberAliases?>
        <NICNumberAliases>
           <id>123</id>
        </NICNumberAliases>
        <?xml-multiple managersNICNumber?>
        <?xml-multiple xxxx?>
        <xxxx>
           <userId>bbbbee</userId>
        </xxxx>
     </NICNumbers>
  </payload>
 </jsonObject>
 </jsonArray>

从输入消息中,我将"managersNICNumber“的内容移到xxxx。managersNICNumber在输入负载中有<?xml-multiple managersNICNumber?>。甚至我也将managersNICNumber移到xxxx,从XSLT接收到的消息中也包含<?xml-multiple managersNICNumber?>

我的XSLT有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-31 12:10:35

我无法遵循XSLT的逻辑。AFAICT,可以使用以下方法产生所需的结果:

XSLT1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- add wrapper  -->
<xsl:template match="/">
    <jsonArray>
        <xsl:apply-templates/>
    </jsonArray>
</xsl:template>

<xsl:template match="payload">
    <xsl:copy>
        <!-- move address to here -->
        <xsl:copy-of select="NICNumber/address" />
        <xsl:processing-instruction name="xml-multiple">NICNumbers</xsl:processing-instruction>
        <xsl:apply-templates select="NICNumber"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="NICNumber">
    <NICNumbers>
        <!-- remove address -->
        <xsl:apply-templates select="node()[not(self::address)]"/>
    </NICNumbers>
</xsl:template>

<!-- rename NICNumberAlias [1] -->
<xsl:template match="processing-instruction('xml-multiple')[.='NICNumberAlias']">
    <xsl:processing-instruction name="xml-multiple">NICNumberAliases</xsl:processing-instruction>
</xsl:template>

<!-- rename NICNumberAlias [2] -->
<xsl:template match="NICNumberAlias">
    <NICNumberAliases>
        <xsl:apply-templates/>
    </NICNumberAliases>
</xsl:template>

<!-- rename managersNICNumber [1] -->
<xsl:template match="processing-instruction('xml-multiple')[.='managersNICNumber']">
    <xsl:processing-instruction name="xml-multiple">xxxx</xsl:processing-instruction>
</xsl:template>

<!-- rename managersNICNumber [2] -->
<xsl:template match="managersNICNumber">
    <xxxx>
        <xsl:apply-templates/>
    </xxxx>
</xsl:template>

</xsl:stylesheet>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57289685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档