2015-05-27 3 views
1

Я очень новый с 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> 

Может кто-нибудь помочь, пожалуйста?

Благодаря Джордж

ответ

1

Как насчет просто:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<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="Phones"> 
    <xsl:copy> 
     <xsl:apply-templates select="Phone"> 
     <xsl:sort select="string-length(substring-before('4213', @PhoneType))" data-type="number" order="ascending"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

P.S.

<xsl:template match="@Phones"> 

ничего не соответствует вашему XML.И у вас, конечно же, не может быть двух шаблонов, соответствующих одному и тому же набору узлов; будет применен только один из них.

Для того, чтобы выполнить свой грандиозный план, вы должны (1) написать Phone узлов в переменную, заменяя PhoneType с другой строкой; (2) преобразовать эту переменную в набор узлов; (3) сортировать узел и записывать его на выход, заменяя PhoneType на исходное значение.

+0

Я ценю ваш быстрый ответ! Все прошло отлично. Кажется простым, но я бы никогда не подумал об этом решении (только что попал в мир XSLT), Я очень благодарю вас! – Gef

Смежные вопросы