Есть ли способ разрешить конфликты пространства имен XML в возвращаемом массиве данных с использованием XSLT

#xml #xslt #xslt-1.0

#xml #xslt #xslt-1.0

Вопрос:

Я новичок в 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. Вы уверены, что хотите / должны это сделать? Это не самый подходящий формат XML.

2. Я откатил ваш вопрос до того, каким он был при ответе. Вы должны опубликовать новый вопрос с вашей новой проблемой. — P.S. В вашем новом XSLT вы неправильно объявили соответствующее пространство имен: оно должно быть xmlns:mvm="http://www.mvm.co.uk" .

3. Прошу прощения, новичок в использовании этих форумов. Я попробую использовать это пространство имен и, если все еще возникают проблемы, опубликую новые вопросы. Приветствия

Ответ №1:

В данном 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>
  

Комментарии:

1. Как бы выглядел XSLT, если бы вы использовали атрибутивный подход, чтобы я мог попробовать оба?

2. Смотрите дополнение к моему ответу.