我有一个看起来像下面的xml。我需要你的帮助将下面的xml转换为 删除所有名称空间以及“Return”标记。感谢是否有人为我提供了正确的xsl。
我厌倦了尝试几件事。
原始XML:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<ns:Response xmlns:ns="http://demo.test.classes.com">
<ns:return>
<ns:person>
<ns:personName></ns:personName>
<ns:personAge></ns:personAge>
<ns:personAddress>
<ns:addressType>official</ns:addressType>
<ns:addressLine1>official address line 1</ns:addressLine1>
</ns:personAddress>
<ns:personAddress>
<ns:addressType>residence</ns:addressType>
<ns:addressLine1>residence address line 1</ns:addressLine1>
</ns:personAddress>
</ns:person>
</ns:return>
</ns:Response>
</soapenv:Body>
</soapenv:Envelope>
转换后的预期XML:
<Response>
<person>
<personName></personName>
<personAge></personAge>
<personAddress>
<addressType>official</addressType>
<addressLine1>official address line 1</addressLine1>
</personAddress>
<personAddress>
<addressType>residence</addressType>
<addressLine1>residence address line 1</addressLine1>
</personAddress>
</person>
</Response>
这是XSLT,我现在正在使用。但这并不是我需要的xml。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="Response/return" />
</xsl:stylesheet>
答案 0 :(得分:1)
请记住,SOAP不使用任何名称间隔属性,因此您可以稍微简化一下。这个非常简短的XSLT 1.0样式表将起到作用。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns="http://demo.test.classes.com"
exclude-result-prefixes="xsl soapenv ns">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="ns:return|soapenv:Envelope|soapenv:Body">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
由于这是一个SOAP文档,因此您不太可能对评论和PI感兴趣。但是如果你真的想让他们回来,那么调整就是一件小事。
答案 1 :(得分:0)
而不是
<xsl:template match="Response/return" />
你需要
<xsl:template xmlns:ns="http://demo.test.classes.com" match="ns:return">
<xsl:apply-templates/>
</xsl:template>
这样ns:return
的子项和后代就会被您编写的其他模板处理。