Я пытался удалить конкретный элемент, если его вывод пуст в XSLT - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь удалить элемент Error Description, если он содержит пустое значение, используя xslt.Я перепробовал множество вариантов, но он не работает.

Например, если внутри Acknowledgement все элементы получают значение 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 голосов
/ 22 февраля 2019

Если вы используете нисходящий подход с буквальными элементами результата , вы всегда получите этот элемент в выводе.Тогда ваш единственный выбор - соединить два преобразования в цепочку или использовать двухпроходное преобразование.

Выражение XPath, чтобы узнать, является ли текущий узел 1006 * пустым (true) или нет (false):

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

Редактировать

Таблица стилей previus является общей.Если вы хотите настроить таргетинг на конкретные элементы, вам нужно сопоставить эти элементы с шаблоном в шаблоне.Пример:

<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>
0 голосов
/ 22 февраля 2019

Я думаю, что это можно сделать, если вы не думаете о чем-то большом:

<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-set или msxsl: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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...