Есть ли способ разрешения конфликтов пространства имен XML в возвращенном массиве данных с использованием XSLT? - PullRequest
0 голосов
/ 29 марта 2019

Я новичок в XSLT и получаю ответ XML , который отображается в массиве с конфликтами пространства имен для элементов XML, которые мне нужно сделать уникальными для дальнейшей работыс в другой системе.

Ниже приведен XML-ответ, который я пытаюсь преобразовать с помощью XSLT, а также желаемый результат. Я хочу сделать каждый повторяющийся элемент <WorksheetServiceProperty> уникальным в новом выходном XML-документе после XSLT.преобразование с использованием суффикса или префикса для элемента.

ПЕРВОНАЧАЛЬНЫЙ XML-ДОКУМЕНТ, КОТОРЫЙ БУДЕТ ПРЕОБРАЗОВАТЬСЯ

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <GetWorksheetDetailExtraInfoFieldsResponse xmlns="http://webservices.whitespacews.com/">
         <GetWorksheetDetailExtraInfoFieldsResult>
            <ErrorCode>0</ErrorCode>
            <ErrorDescription>Success</ErrorDescription>
            <SuccessFlag>true</SuccessFlag>
            <WorksheetServiceProperties>
               <WorksheetServiceProperty>
                  <ExtensionData />
                  <WorksheetServiceID>42</WorksheetServiceID>
                  <ServicePropertyID>10</ServicePropertyID>
                  <ServicePropertyName>Job Completed</ServicePropertyName>
                  <ServicePropertyValue>Yes</ServicePropertyValue>
                  <ServicePropertyTypeID>4</ServicePropertyTypeID>
                  <ServicePropertyTypeName>List</ServicePropertyTypeName>
                  <ServicePropertyOrder>30</ServicePropertyOrder>
                  <ForMobile>true</ForMobile>
                  <ForPowerSuite>true</ForPowerSuite>
               </WorksheetServiceProperty>
               <WorksheetServiceProperty>
                  <ExtensionData />
                  <WorksheetServiceID>42</WorksheetServiceID>
                  <ServicePropertyID>15</ServicePropertyID>
                  <ServicePropertyName>Crew Comments</ServicePropertyName>
                  <ServicePropertyValue>Collected all items successfully</ServicePropertyValue>
                  <ServicePropertyTypeID>7</ServicePropertyTypeID>
                  <ServicePropertyTypeName>TextBox</ServicePropertyTypeName>
                  <ServicePropertyOrder>5</ServicePropertyOrder>
                  <ForMobile>true</ForMobile>
                  <ForPowerSuite>true</ForPowerSuite>
               </WorksheetServiceProperty>
               <WorksheetServiceProperty>
                  <ExtensionData />
                  <WorksheetServiceID>42</WorksheetServiceID>
                  <ServicePropertyID>16</ServicePropertyID>
                  <ServicePropertyName>Items To Be Collected</ServicePropertyName>
                  <ServicePropertyValue>Matress, bed frame, fridge</ServicePropertyValue>
                  <ServicePropertyTypeID>1</ServicePropertyTypeID>
                  <ServicePropertyTypeName>String</ServicePropertyTypeName>
                  <ServicePropertyOrder>2</ServicePropertyOrder>
                  <ForMobile>true</ForMobile>
                  <ForPowerSuite>true</ForPowerSuite>
               </WorksheetServiceProperty>               
            </WorksheetServiceProperties>
         </GetWorksheetDetailExtraInfoFieldsResult>
      </GetWorksheetDetailExtraInfoFieldsResponse>
   </soap:Body>
</soap:Envelope>

ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <GetWorksheetDetailExtraInfoFieldsResponse xmlns="http://webservices.whitespacews.com/">
         <GetWorksheetDetailExtraInfoFieldsResult>
            <ErrorCode>0</ErrorCode>
            <ErrorDescription>Success</ErrorDescription>
            <SuccessFlag>true</SuccessFlag>
            <WorksheetServiceProperties>
               <WorksheetServiceProperty1>
                  <ExtensionData />
                  <WorksheetServiceID>42</WorksheetServiceID>
                  <ServicePropertyID>10</ServicePropertyID>
                  <ServicePropertyName>Job Completed</ServicePropertyName>
                  <ServicePropertyValue>Yes</ServicePropertyValue>
                  <ServicePropertyTypeID>4</ServicePropertyTypeID>
                  <ServicePropertyTypeName>List</ServicePropertyTypeName>
                  <ServicePropertyOrder>30</ServicePropertyOrder>
                  <ForMobile>true</ForMobile>
                  <ForPowerSuite>true</ForPowerSuite>
               </WorksheetServiceProperty1>
               <WorksheetServiceProperty2>
                  <ExtensionData />
                  <WorksheetServiceID>42</WorksheetServiceID>
                  <ServicePropertyID>15</ServicePropertyID>
                  <ServicePropertyName>Crew Comments</ServicePropertyName>
                  <ServicePropertyValue>Collected all items successfully</ServicePropertyValue>
                  <ServicePropertyTypeID>7</ServicePropertyTypeID>
                  <ServicePropertyTypeName>TextBox</ServicePropertyTypeName>
                  <ServicePropertyOrder>5</ServicePropertyOrder>
                  <ForMobile>true</ForMobile>
                  <ForPowerSuite>true</ForPowerSuite>
               </WorksheetServiceProperty2>
               <WorksheetServiceProperty3>
                  <ExtensionData />
                  <WorksheetServiceID>42</WorksheetServiceID>
                  <ServicePropertyID>16</ServicePropertyID>
                  <ServicePropertyName>Items To Be Collected</ServicePropertyName>
                  <ServicePropertyValue>Matress, bed frame, fridge</ServicePropertyValue>
                  <ServicePropertyTypeID>1</ServicePropertyTypeID>
                  <ServicePropertyTypeName>String</ServicePropertyTypeName>
                  <ServicePropertyOrder>2</ServicePropertyOrder>
                  <ForMobile>true</ForMobile>
                  <ForPowerSuite>true</ForPowerSuite>
               </WorksheetServiceProperty3>               
            </WorksheetServiceProperties>
         </GetWorksheetDetailExtraInfoFieldsResult>
      </GetWorksheetDetailExtraInfoFieldsResponse>
   </soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 29 марта 2019

В данном XML нет конфликтов пространства имен, и то, что вы хотите сделать, легко сделать:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ws="http://webservices.whitespacews.com/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="ws:WorksheetServiceProperty">
    <xsl:element name="{name()}{position()}" namespace="{namespace-uri()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

Умно ли это делать - это другой вопрос. Братьев и сестер с пронумерованными именами трудно обрабатывать. Лучше всего использовать для нумерации атрибут :

<xsl:template match="ws:WorksheetServiceProperty">
    <xsl:copy>
        <xsl:attribute name="number">
            <xsl:value-of select="position()"/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
...