首页 > 解决方案 > 如果 XSLT 中的输出为空,我尝试删除特定元素

问题描述

如果错误描述元素包含使用 xslt 的空值,我正在尝试删除它。我尝试了很多选择,但它不起作用。

例如,如果在 Acknowledgment 中所有元素都为空,则输出得到空确认,所以我想删除确认元素空标签。

下面是xml和xslt

<?xml version="1.0" encoding="UTF-8" ?>
<updateDocumentStatusResponse xmlns="http://xmlns.be/CommgrService_Message/v001">
   <Acknowledgement>
      <Result>SUCCESS</Result>
      <ErrorCode>ErrorCode1375</ErrorCode>
      <ErrorDescription></ErrorDescription>
   </Acknowledgement>
</updateDocumentStatusResponse>

XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:ns1="http://xmlns.be/CSM/v001" xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction" xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions" xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" xmlns:oracle-xsl-mapper="http://www.oracle.com/xsl/mapper/schemas" xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue" xmlns:oraxsl="http://www.oracle.com/XSL/Transform/java" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://xmlns.be/CommgrService_Message/v001" exclude-result-prefixes=" xsd oracle-xsl-mapper xsi xsl ns1 ns0 mhdr oraext xp20 xref socket dvm oraxsl"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"



                xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
   <oracle-xsl-mapper:schema>

      <oracle-xsl-mapper:mapSources>
         <oracle-xsl-mapper:source type="WSDL">
            <oracle-xsl-mapper:schema location="../WSDLs/CommgrService_v001.wsdl"/>
            <oracle-xsl-mapper:rootElement name="updateDocumentStatusResponse" namespace="http://xmlns.be/CommgrService_Message/v001"/>
         </oracle-xsl-mapper:source>        
      </oracle-xsl-mapper:mapSources>


   </oracle-xsl-mapper:schema>
   <!--User Editing allowed BELOW this line - DO NOT DELETE THIS LINE-->

   <xsl:template match="/">
      <ns1:Output>
         <ns1:CommunicationResponse>           
            <ns1:Acknowledgement>
               <ns1:Result>
                  <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:Result"/>
               </ns1:Result>
               <ns1:ErrorCode>
                  <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:ErrorCode"/>
               </ns1:ErrorCode>
               <ns1:ErrorDescription>
                  <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:ErrorDescription"/>
               </ns1:ErrorDescription>
            </ns1:Acknowledgement>
         </ns1:CommunicationResponse>
      </ns1:Output>
   </xsl:template>
</xsl:stylesheet>

我怎样才能做到这一点?

标签: xslt

解决方案


我认为如果您不考虑大事,可以这样做:

<xsl:if test="normalize-space(/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:ErrorDescription) != ''">
         <ns1:ErrorDescription>
              <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:ErrorDescription"/>
         </ns1:ErrorDescription>
</xsl:if>

编辑:

一种使用扩展函数来实现此目的的方法,例如exsl:node-setmsxsl:node-set能够进一步处理在另一个模板中创建的结果树片段:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:ns1="http://xmlns.be/CSM/v001" xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction" xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions" xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" xmlns:oracle-xsl-mapper="http://www.oracle.com/xsl/mapper/schemas" xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue" xmlns:oraxsl="http://www.oracle.com/XSL/Transform/java" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://xmlns.be/CommgrService_Message/v001" exclude-result-prefixes=" xsd oracle-xsl-mapper xsi xsl ns1 ns0 mhdr oraext xp20 xref socket dvm oraxsl"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<oracle-xsl-mapper:schema>
    <oracle-xsl-mapper:mapSources>
        <oracle-xsl-mapper:source type="WSDL">
            <oracle-xsl-mapper:schema location="../WSDLs/CommgrService_v001.wsdl" />
            <oracle-xsl-mapper:rootElement name="updateDocumentStatusResponse" namespace="http://xmlns.be/CommgrService_Message/v001" />
        </oracle-xsl-mapper:source>
    </oracle-xsl-mapper:mapSources>
</oracle-xsl-mapper:schema>
<!--User Editing allowed BELOW this line - DO NOT DELETE THIS LINE -->

<xsl:template match="/">
    <xsl:variable name="result">
        <ns1:Output>
            <ns1:CommunicationResponse>
                <ns1:Acknowledgement>
                    <ns1:Result>
                        <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:Result" />
                    </ns1:Result>
                    <ns1:ErrorCode>
                        <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:ErrorCode" />
                    </ns1:ErrorCode>
                    <ns1:ErrorDescription>
                        <xsl:value-of select="/ns0:updateDocumentStatusResponse/ns0:Acknowledgement/ns0:ErrorDescription" />
                    </ns1:ErrorDescription>
                </ns1:Acknowledgement>
            </ns1:CommunicationResponse>
        </ns1:Output>
    </xsl:variable>

    <xsl:apply-templates select="exsl:node-set($result)/*" mode="step2" />
</xsl:template>

<xsl:template match="*[not(normalize-space())]" mode="step2" />
<xsl:template match="@* | node()" mode="step2">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" mode="step2" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

http://xsltransform.net/93wkLHW


推荐阅读