我有一个输入和所需的输出xml文件,但不能为此编写通用的xsl转换器。这里有人可以帮帮我吗?地址/计费在运行时可能有更多元素,应该直接复制到主人块。
<searchPersonResponse>
<persons>
<person>
<name>name2</name>
<address>
<billing>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</billing>
</address>
</person>
<person>
<name>name1</name>
<address>
<billing>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</billing>
</address>
</person>
</persons>
</searchPersonResponse>
所需的输出xml
<searchPersonResponse>
<persons>
<person>
<name>name2</name>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</person>
<person>
<name>name1</name>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</person>
</persons>
</searchPersonResponse>
答案 0 :(得分:2)
已编辑:当地址与结算子女一起出现时,OP只希望“解包”地址和结算元素。 XSLT现在可以做到这一点。此外,OP提到需要一个XSLT 1.0解决方案;没有使用XSLT 2.0功能,所以我只是将版本更改为“1.0”。
此XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="address[child::billing]|billing[parent::address]">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于此XML时:
<searchPersonResponse>
<persons>
<person>
<name>name2</name>
<address>
<billing>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</billing>
</address>
</person>
<person>
<name>name1</name>
<address>
<billing>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</billing>
</address>
</person>
</persons>
</searchPersonResponse>
产生所需的结果:
<searchPersonResponse>
<persons>
<person>
<name>name2</name>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</person>
<person>
<name>name1</name>
<city>xx</city>
<state>yyyy</state>
<zip>zzzzz</zip>
</person>
</persons>
</searchPersonResponse>
身份模板将复制所有节点和属性。地址和帐单匹配模板(与任一元素匹配)将复制他们的孩子而不是他们自己。