我尝试删除特定元素,如果其输出在XSLT中为空

时间:2019-02-22 13:45:06

标签: xslt

我尝试使用xslt删除错误描述元素(如果它包含空值)。我尝试了很多选择,但没有用。

例如,如果在“确认”中所有元素都为null,则输出为空确认,因此我想删除确认元素为空标记。

下面是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>

我该如何实现?

2 个答案:

答案 0 :(得分:0)

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

<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

答案 1 :(得分:0)

如果您使用literal result elements自上而下的方法,则总是会在输出中获取该元素。然后,您唯一的选择是链接两个转换或使用两次通过转换。

知道current node是否为空(真)(假)的XPath表达式是:

"not(node())"

例如,此输入文档

<?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>

有了这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements ="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[not(node())]"/>
</xsl:stylesheet>

输出

<updateDocumentStatusResponse xmlns="http://xmlns.be/CommgrService_Message/v001">
   <Acknowledgement>
      <Result>SUCCESS</Result>
      <ErrorCode>ErrorCode1375</ErrorCode>
   </Acknowledgement>
</updateDocumentStatusResponse>

编辑

上一个样式表是常规的。如果要定位特定元素,则需要将这些元素与模板中的模式匹配。示例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements ="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ErrorDescription[not(node())]"/>
</xsl:stylesheet>