#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