尝试使用xsltproc读取XML值

时间:2014-06-21 18:31:13

标签: 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 个答案:

答案 0 :(得分:2)

首先,您的XML输入格式不正确:最后一个<MBusData>标记需要是结束标记</MBusData>

接下来,这个:

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

什么都不选。您位于/根节点的上下文中,并且没有Datarecord个元素是/的子元素。此外,XML区分大小写,DatarecordDataRecord不同。所以你需要将其更改为:

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

最后,ValueDatarecord孩子,而非属性 - 所以您需要更改此内容:

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

为:

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

编辑:

  

THX,它有效,但如果我只想阅读一个具体内容,该怎么办?   DataRecord,比方说id =“1”?

然后你不应该使用for-each。相反,尝试:

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