#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″?