我想使用xslt重新构造XML。在输入XML中有?xml-多个标记。
输入
<?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
<?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>预期结果
<?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>但我收到的回应如下。
<?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有什么问题吗?
发布于 2019-07-31 12:10:35
我无法遵循XSLT的逻辑。AFAICT,可以使用以下方法产生所需的结果:
XSLT1.0
<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>https://stackoverflow.com/questions/57289685
复制相似问题