Как скопировать пространство имен родительского узла в дочерний элемент, используя xslt? - PullRequest
0 голосов
/ 24 сентября 2019

Мой xml выглядит так, как будто я создал его с использованием Java JAXBContext и Marshaller.Я хочу отформатировать только часть XML, а не весь XML.

<?xml version="1.0" encoding="UTF-8"?>
<ns4:Requests xmlns:ns2="http://www.dummy.com/xsd/tublu/murmur_001" xmlns:ns3="http://www.dummy.com/xsd/CommonObjects_001" xmlns:ns4="http://www.dummy.com/xsd/naku_001">
   <ns4:RequestSetId>fhskgvseruigiu</ns4:RequestSetId>
   <ns4:RequestStream>CHAPP</ns4:RequestStream>
   <ns4:Request>
      <ns4:TrackAndTrace>
         <ns4:CPAId>003</ns4:CPAId>
         <ns4:CorrelationId>ytuty</ns4:CorrelationId>
      </ns4:TrackAndTrace>
   </ns4:Request>
   <ns4:Request>
      <ns4:TrackAndTrace>
         <ns4:CPAId>003</ns4:CPAId>
         <ns4:CorrelationId>cyuri7</ns4:CorrelationId>
      </ns4:TrackAndTrace>
   </ns4:Request>
</ns4:Requests>

Я хочу отформатировать как

<?xml version="1.0" encoding="UTF-8"?>
<ns4:Requests xmlns:ns2="http://www.dummy.com/xsd/tublu/murmur_001" xmlns:ns4="http://www.dummy.com/xsd/naku_001" xmlns:ns3="http://www.dummy.com/xsd/CommonObjects_001">
    <ns4:RequestSetId>fhskgvseruigiu</ns4:RequestSetId>
    <ns4:RequestStream>CHAPP</ns4:RequestStream>
    <ns4:Request xmlns:ns4="http://www.dummy.com/xsd/naku_001"><ns4:TrackAndTrace><ns4:CPAId>003</ns4:CPAId><ns4:CorrelationId>ytuty</ns4:CorrelationId></ns4:TrackAndTrace></ns4:Request>
    <ns4:Request xmlns:ns4="http://www.dummy.com/xsd/naku_001"><ns4:TrackAndTrace><ns4:CPAId>003</ns4:CPAId><ns4:CorrelationId>cyuri7</ns4:CorrelationId></ns4:TrackAndTrace></ns4:Request>
</ns4:Requests>

1 Ответ

1 голос
/ 24 сентября 2019

Вот решение (путем преобразования XML-данных с использованием API-интерфейсов Java XSLT),

Как вы, возможно, уже заметили ... Один JAXB не может удовлетворить это требование, но после сортировки объекта в отформатированной XML-строке(как вы уже показали), вы можете затем обработать / преобразовать его соответствующим образом, используя подходящий XSLT-файл

Таким образом, чтобы получить линеаризованный элемент 'Request', просто используйте xsl, показанный ниже:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="TrackAndTrace"/> 
    <xsl:strip-space elements="Request"/> 

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

</xsl:stylesheet>

Примечание: также проверено, что вышеуказанный метод / подход работает должным образом - использовал образец кода Stylizer (от https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html)

Cheers!

Обновление: если вы хотитерешение, которое также сохраняет исходный префикс пространства имен, как показано в вашем вопросе, следуйте этому варианту. Добавьте factory.setNamespaceAware (true); в коде стилизатора и используйте этот измененный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform" xmlns:ns4="dummy.com/xsd/naku_001">
<xsl:strip-space elements="ns4:TrackAndTrace"/>
<xsl:strip-space elements="ns4:Request"/> 
   <xsl:template match="@*|node()">
       <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
   </xsl:template>
</xsl:stylesheet> 
...