XSL attirbutes с тем же именем

#xslt

#xslt

Вопрос:

Я пишу преобразование xslt для приведенного ниже кода XLS:

 <?xml version="1.0"?>
<OTA_HotelPmsInfoNotif xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" EchoToken="PMS" Version="0.101" PrimaryLangID="en" ClosureDate="2020-10-29" RetransmissionIndicator="true" SequenceNmbr="2" TimeStamp="2020-10-29T23:51:00Z">
  <POS>
    <Source>
      <RequestorID Type="81" ID="POF" ID_Context="parol"/>
    </Source>
    <Source ISOCountry="CZ" ISOCurrency="CZE">
      <RequestorID Type="10" ID="H1111" ID_Context="star">
        <CompanyName>Pharmacy Prague</CompanyName>
      </RequestorID>
    </Source>
  </POS>
</OTA_HotelPmsInfoNotif>  

Я хотел бы извлечь из этого атрибута XML с именем ID, но, как вы можете видеть, есть два атрибута ID, ID =»POF» и ID = «H1111». На данный момент у меня есть следующее:

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
  <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
  <xsl:template match="/">
    <xsl:text>RID</xsl:text>
    <xsl:text>amp;#13;amp;#10;</xsl:text>

    <xsl:for-each select="OTA_HotelPmsInfoNotif/POS/Source/RequestorID">
        <xsl:text>"</xsl:text>
            <xsl:if test ="@ID='H1111'">
                <xsl:value-of select="@ID"/>
            </xsl:if>
            <xsl:text>";"</xsl:text>
            <xsl:text>"</xsl:text>
        <xsl:text>amp;#13;amp;#10;</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>  

Но этот код вводит одну пустую строку для ID=»POF». Как извлечь только один атрибут ID =»H1111″?

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

1. Что вы хотите получить в качестве результата вашего преобразования?

2. Я думаю, вам просто нужно поместить все ваши 3 элемента <xsl:text> внутрь <xsl:if test =»@ID=’H1111′»>

3. У вас есть 2 RequestorID элемента с ID атрибутом. Если вы хотите получить значение ID только от одного из элементов, вам нужно указать в вашей таблице стилей, какой именно. Итак, вам нужно что-то знать об элементе, который может использовать таблица стилей, чтобы найти его — например Type . Конечно, если вы знаете, что ID значение равно H1111 , вам не нужно его получать; вы можете просто записать его как есть.

4. Спасибо за ответы. Основываясь на том, что я прочитал, я думаю, что буду использовать @Type для различения двух элементов. Хотя я еще не знаю, как 🙂

Ответ №1:

Если вы знаете значение Type атрибута, вы можете просто:

 <xsl:value-of select="OTA_HotelPmsInfoNotif/POS/Source/RequestorID[@Type='10']/@ID"/>
  

Демонстрация: https://xsltfiddle .liberty-development.net/aiyndY