使用XSLT排除XML空元素
我有以下xml输入文件,并试图获得一个没有空节点的输出xml使用XSLT排除XML空元素,xml,xslt,Xml,Xslt,我有以下xml输入文件,并试图获得一个没有空节点的输出xml <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xm
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext">
<soap:Body>
<InstantIDResponseEx xmlns="http://webservices.seisint.com/WsIdentity">
<response>
<Header>
<Status>0</Status>
<TransId>41904</TransId>
<User></User>
</Header>
<Result>
<Data/>
</Result>
</response>
</InstantIDResponseEx>
</soap:Body>
</soap:Envelope>
0
41904
我希望输出类似于以下xml:
<?xml version="1.0" encoding="UTF-8"?>
<Verification_response>
<System_Data>
<STATUSMESSAGE>0</STATUSMESSAGE>
<TRANSACTIONID>41904</TRANSACTIONID>
</System_Data>
</Verification_response>
0
41904
您的样式表有几处问题,可以解释为什么您觉得这很困难
首先,它是完全单一的:您只有一个与根节点匹配的模板规则,这使得添加条件逻辑非常混乱。您应该针对“递归下降”模式,其中每个节点都使用与节点匹配的模板规则进行处理,并调用apply templates来处理其子节点
其次,禁用输出转义的使用非常奇怪。我很惊讶在初学者的样式表中经常看到这种情况。在某些情况下,之所以这样做是因为人们不理解XSLT是为了生成节点树,而不是为了生成词汇XML。但在这种情况下,这是不必要的,也是错误的:如果文本中有特殊字符,那么您希望对其进行转义,而禁用转义只会在数据中出现特殊字符时给您带来错误的输出。不要这样做
现在谈谈你的问题
首先,添加以下内容是一个好主意
<xsl:strip-space elements="*"/>
对于这种XML,空格没有任何意义,只是起到了阻碍作用
现在,您可以为Status和TransId元素编写规则:
<xsl:template match="Status">
<STATUSMESSAGE>
<xsl:value-of select="."/>
</STATUSMESSAGE>
</xsl:template>
<xsl:template match="TransId">
<TRANSACTIONID>
<xsl:value-of select="."/>
</TRANSACTIONID>
</xsl:template>
<xsl:template match="*[not(child::node)]"/>
其他要素的一般规则似乎是:
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
虽然这实际上是默认规则,所以如果你想的话可以省略它
现在你说你想要一个规则,你不想要空节点。我在解释上有点困难,因为你没有给出足够的例子。但是如果TransId为空,那么就不想输出TRANSACTIONID元素。然后,您可以通过为空元素添加更高优先级的规则来实现这一点:
<xsl:template match="Status">
<STATUSMESSAGE>
<xsl:value-of select="."/>
</STATUSMESSAGE>
</xsl:template>
<xsl:template match="TransId">
<TRANSACTIONID>
<xsl:value-of select="."/>
</TRANSACTIONID>
</xsl:template>
<xsl:template match="*[not(child::node)]"/>
然后你的首要规则应该是:
<xsl:template match="/">
<Verification_response>
<System_Data>
<xsl:apply-templates select="/soap:Envelope/soap:Body/Identity:InstantIDResponseEx/Identity:response"/>
</System_Data>
</Verification_response>
</xsl:template>
您对问题的哪一部分有困难?您尝试了什么,哪里遇到了问题?我的问题是如何将xml文件转换为另一个排除了空节点的xml文件。我的问题是如何编写xslt样式表,将xml文件转换为另一个排除了空节点的xml文件。嗯,我不会为你写整个样式表。如果您向我们展示您迄今为止所取得的成就,那么我们可以看到您遇到的困难,并帮助您克服下一个障碍。我添加了一个样式表。我是XSLT新手,因此我试图找到从结果中排除空元素的最佳方法。我得到的结果是:schemas.xmlsoap.org/soap/envelope/“>041904我在另一篇文章中发布了样式表。怎么了?您需要在匹配模式中使用Identity:前缀。