我有这个XML:
<Envelope>
<Body>
<Response>
<return>
<contact_main>
<firstname>John</firstname>
<lastname>Doe</lastname>
<error>false</error>
<errors/>
</contact_main>
<contact_info1>
<address1>High Road 748</address1>
<zip>N17 0AP</zip>
<city>London</city>
<country_name>England</country_name>
<error>true</error>
<errors>
<item>
<text>Some error text here</text>
</item>
</errors>
</contact_info1>
<contact_card>
<number>12345678</number>
<status>Expired</status>
<valid_to>2010-01-02Z</valid_to>
<valid>false</valid>
<error>true</error>
<errors>
<item>
<text>Card is not valid.</text>
</item>
</errors>
</contact_card>
</return>
</Response>
<account_name>No name</account_name>
<number>12345678</number>
</Body>
</Envelope>
使用此XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="Response">
<response>
<contact>
<xsl:copy-of select="return/contact_main/node()"/>
<xsl:copy-of select="return/contact_info1/node()"/>
</contact>
<card>
<xsl:copy-of select="return/contact_card/node()"/>
</card>
</response>
</xsl:template>
<xsl:template match="account_name"/>
<xsl:template match="number"/>
</xsl:stylesheet>
我得到以下结果:
<response>
<contact>
<firstname>John</firstname>
<lastname>Doe</lastname>
<error>false</error>
<errors />
<address1>High Road 748</address1>
<zip>N17 0AP</zip>
<city>London</city>
<country_name>England</country_name>
<error>true</error>
<errors>
<item>
<text>Some error text here</text>
</item>
</errors>
</contact>
<card>
<number>12345678</number>
<status>Expired</status>
<valid_to>2010-01-02Z</valid_to>
<valid>false</valid>
<error>true</error>
<errors>
<item>
<text>Card is not valid.</text>
</item>
</errors>
</card>
</response>
在结果中,有多个节点具有相同的名称“错误”和“错误”。 我想从他们当前的父母那里取出他们并将它们全部添加到xml的底部,所以我将有1个“错误”节点和1个“错误”数组,包含整个xml中的所有错误文本。
所以最终的xml看起来像这样:
<response>
<contact>
<firstname>John</firstname>
<lastname>Doe</lastname>
<address1>High Road 748</address1>
<zip>N17 0AP</zip>
<city>London</city>
<country_name>England</country_name>
</contact>
<card>
<number>12345678</number>
<status>Expired</status>
<valid_to>2010-01-02Z</valid_to>
<valid>false</valid>
</card>
<error>true</error>
<errors>
<text>Some error text here</text>
<text>Card is not valid.</text>
</errors>
</response>
这可能吗?
答案 0 :(得分:0)
您可以在按xsl:copy-of
复制时显式排除错误节点,然后在整个文档中计算error
个节点,如果count大于零,则渲染为“true”。
XLST的简短示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="Response">
<response>
<contact>
<xsl:copy-of select="return/contact_main/node()[local-name() != 'error' and local-name() != 'errors']"/>
<xsl:copy-of select="return/contact_info1/node()[local-name() != 'error' and local-name() != 'errors']"/>
</contact>
<card>
<xsl:copy-of select="return/contact_card/node()[local-name() != 'error' and local-name() != 'errors']"/>
</card>
<error><xsl:value-of select="count(return/*/error[text() = 'true']) > 0"/></error>
<errors>
<xsl:for-each select="return/*/errors/item">
<xsl:copy-of select="text"/>
</xsl:for-each>
</errors>
</response>
</xsl:template>
<xsl:template match="account_name"/>
<xsl:template match="number"/>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="utf-8"?>
<response>
<contact>
<firstname>John</firstname>
<lastname>Doe</lastname>
<address1>High Road 748</address1>
<zip>N17 0AP</zip>
<city>London</city>
<country_name>England</country_name>
</contact>
<card>
<number>12345678</number>
<status>Expired</status>
<valid_to>2010-01-02Z</valid_to>
<valid>false</valid>
</card>
<error>true</error>
<errors>
<text>Some error text here</text>
<text>Card is not valid.</text>
</errors>
</response>