Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT排除XML空元素_Xml_Xslt - Fatal编程技术网

使用XSLT排除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输入文件,并试图获得一个没有空节点的输出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/" 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:前缀。