#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. Смотрите дополнение к моему ответу.