Я очень новый с XSLT, и я пытаюсь найти способ сделать следующее ...XSLT Изменение значений атрибутов и сортировка
У меня есть следующий XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<AddCustomerRequest APIVersion="2.0" Name="Add Customers List Data">
<CFParameters>
<ReqId>1-YNU68</ReqId>
<CfgId>1-TSP13</CfgId>
</CFParameters>
<Parameters>
<ParName>Test Customer List</ParName>
<ListName>Test Customer List</ListName>
<Summary>N</Summary>
<CustomerList>
<CustomerInfo>
<LoadID>1-YNU4R</LoadID>
<CustomerID>1-E0FB</CustomerID>
<LoadConID>1-YTQJ5</LoadConID>
<TimeZone></TimeZone>
<Available>Y</Available>
<Phones>
<Phone PhoneType="2">6987991657</Phone>
<Phone PhoneType="1">6987991152</Phone>
<Phone PhoneType="4">6987999912</Phone>
<Phone PhoneType="3">6987999278</Phone>
</Phones>
<CustomFields></CustomFields>
</CustomerInfo>
</CustomerList>
</Parameters>
</AddCustomerRequest>
Каждый клиент (CustomerInfo элемент) имеет множество телефонов различного PHONETYPE каждое ... значения PHONETYPE эквивалентны следующий: PHONETYPE «1» = Бизнес PHONETYPE «2» = Home PHONETYPE «3» = Другой PHONETYPE «4» = Mobile
Запрос должен отсортировать телефоны по следующей PHONETYPE: 1. Mobile 2. Главная 3. Бизнес 4. Другое
Таким образом, окончательный XML, должен содержать телефоны в следующем порядке :
<Phones>
<Phone PhoneType="4">6987999912</Phone>
<Phone PhoneType="2">6987991657</Phone>
<Phone PhoneType="1">6987991152</Phone>
<Phone PhoneType="3">6987999278</Phone>
</Phones>
для того, чтобы сделать это, я полагаю, я должен сделать следующее (используя XSLT): • Заменить значения PHONETYPE со значениями Temp для того, чтобы иметь возможность сортировать • сортировать телефоны по PHONETYPE • Замените значение температуры PHONETYPE с оригинальными
Например:
Where PhoneType = “4” to be replaced by value “101”
Where PhoneType = “2” to be replaced by value “102”
Where PhoneType = “1” to be replaced by value “103”
Where PhoneType = “3” to be replaced by value “104”
Так, телефоны исходного XML будет выглядеть так:
<Phones>
<Phone PhoneType="102">6987991657</Phone>
<Phone PhoneType="103">6987991152</Phone>
<Phone PhoneType="101">6987999912</Phone>
<Phone PhoneType="104">6987999278</Phone>
</Phones>
Затем Сортировка телефонов PhoneType, чтобы сделать список следующим образом:
<Phones>
<Phone PhoneType="101">6987999912</Phone>
<Phone PhoneType="102">6987991657</Phone>
<Phone PhoneType="103">6987991152</Phone>
<Phone PhoneType="104">6987999278</Phone>
</Phones>
И окончательный, repla се значения температуры PHONETYPE с оригинальными:
Where PhoneType = “101” to be replaced by value “4”
Where PhoneType = “102” to be replaced by value “2”
Where PhoneType = “103” to be replaced by value “1”
Where PhoneType = “104” to be replaced by value “3”
Таким образом, окончательный XML будет выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<AddCustomerRequest APIVersion="2.0" Name="Add Customers List Data">
<CFParameters>
<ReqId>1-YNU68</ReqId>
<CfgId>1-TSP13</CfgId>
</CFParameters>
<Parameters>
<ParName>Test Customer List</ParName>
<ListName>Test Customer List</ListName>
<Summary>N</Summary>
<CustomerList>
<CustomerInfo>
<LoadID>1-YNU4R</LoadID>
<CustomerID>1-E0FB</CustomerID>
<LoadConID>1-YTQJ5</LoadConID>
<TimeZone></TimeZone>
<Available>Y</Available>
<Phones>
<Phone PhoneType="4">6987999912</Phone>
<Phone PhoneType="2">6987991657</Phone>
<Phone PhoneType="1">6987991152</Phone>
<Phone PhoneType="3">6987999278</Phone>
</Phones>
<CustomFields></CustomFields>
</CustomerInfo>
</CustomerList>
</Parameters>
</AddCustomerRequest>
Я попытался выполнить все вышеперечисленное со следующим XSL, но хотя сортировка работает, не заменяя значения (так сортировкой неправильно):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Phones">
<xsl:attribute name="PhoneType">
<xsl:choose>
<xsl:when test=". = 1">
<xsl:text>103</xsl:text>
</xsl:when>
<xsl:when test=". = 2">
<xsl:text>102</xsl:text>
</xsl:when>
<xsl:when test=". = 3">
<xsl:text>104</xsl:text>
</xsl:when>
<xsl:when test=". = 4">
<xsl:text>101</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
<xsl:template match="Phones">
<xsl:copy>
<xsl:apply-templates select="Phone">
<xsl:sort select="@PhoneType"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@Phones">
<xsl:attribute name="PhoneType">
<xsl:choose>
<xsl:when test=". = 103">
<xsl:text>1</xsl:text>
</xsl:when>
<xsl:when test=". = 102">
<xsl:text>2</xsl:text>
</xsl:when>
<xsl:when test=". = 104">
<xsl:text>3</xsl:text>
</xsl:when>
<xsl:when test=". = 101">
<xsl:text>4</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Может кто-нибудь помочь, пожалуйста?
Благодаря Джордж
Я ценю ваш быстрый ответ! Все прошло отлично. Кажется простым, но я бы никогда не подумал об этом решении (только что попал в мир XSLT), Я очень благодарю вас! – Gef