попытка прочитать значения XML с помощью xsltproc

#xml #bash #xslt

#xml #bash #xslt

Вопрос:

Я хочу прочитать, но не могу понять, как это сделать…

Вот файл:

 <MBusData>

    <SlaveInformation>
        <Id>5000619</Id>
        <Manufacturer>SBC</Manufacturer>
        <Version>19</Version>
        <Medium>Electricity</Medium>
        <AccessNumber>254</AccessNumber>
        <Status>00</Status>
        <Signature>0000</Signature>
    </SlaveInformation>

    <DataRecord id="0">
        <Function>Instantaneous value</Function>
        <Unit>Energy (10 Wh)</Unit>
        <Value>686648</Value>
    </DataRecord>

    <DataRecord id="1">
        <Function>Instantaneous value</Function>
        <Unit>Energy (10 Wh)</Unit>
        <Value>686648</Value>
    </DataRecord>

<MBusData>
 

И вот шаблон XSL, который отказывается работать:

 <xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:for-each select="Datarecord">
            <xsl:value-of select="@Value"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
 

Я попытался запустить его с:

 xsltproc xslfile xmlfile
 

Надеюсь, вы сможете помочь…

Ответ №1:

Во-первых, ваш XML-ввод неправильно сформирован: последний <MBusData> тег должен быть закрывающим тегом </MBusData> .

Далее, это:

 <xsl:template match="/">
        <xsl:for-each select="Datarecord">
 

ничего не выбирает. Вы находитесь в контексте / корневого узла, и в нем нет Datarecord дочерних элементов / . Кроме того, XML чувствителен к регистру и Datarecord это не то же самое, что DataRecord . Итак, вам нужно изменить это на:

 <xsl:template match="/">
        <xsl:for-each select="MBusData/DataRecord">
 

Наконец, Value является дочерним элементом Datarecord , а не атрибутом, поэтому вам нужно изменить это:

 <xsl:value-of select="@Value"/>
 

Для:

 <xsl:value-of select="Value"/>
 

Редактировать:

Спасибо, это работает, но что, если я хочу прочитать только одну конкретную запись данных, скажем, id =»1″?

Тогда вы не должны использовать for-each . Вместо этого попробуйте:

 <xsl:template match="/">
    <xsl:value-of select="MBusData/DataRecord[@id='1']/Value"/>
</xsl:template>
 

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

1. Спасибо, это работает, но что, если я хочу прочитать только одну конкретную запись данных, скажем, id =»1″?