1

こんにちは、まず私の英語を許してください;D

私は次の問題を抱えています:

XML

<?xml version="1.0" encoding="utf-8" ?>

<HYDRO_P xmlns="http://www.hydro.ch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.hydro.ch test.xsd">

<!-- groups on project -->

<scada>

    <logicalDevice name="MTU">

        <logicalNode type="specific" name="t_1">  
            <datatype type="messurement" name="speed of PLC1" ref="ID-01" priority="7"/> 
        </logicalNode>


    </logicalDevice>


</scada>

<!-- connected fields on Project -->

<field>

<agent id="100" name="AGENT1" driver="Modbus Serial" port="Serial" portnb="5">
    <device id="101" name="DEVICE1" devicetype="Modbus RTU: M340">
        <address>
            <modbus address="5"/>
            <ip address="127.0.0.1"/>
        </address>
        <items>

            <collection name="COLLECTION1">
                <item id="ID-02" name="ITEM2" datatype="Word" rights="Read/Write">
                    <description>aaaaa</description>
                    <address>IW248</address>
                </item>
            </collection>

            <item id="ID-01" name="ITEM1" datatype="Byte" rights="Read Only">
                <description>BBaa</description>
                <address>IB02</address>
            </item>


        </items>
    </device>
</agent>

</field>


</HYDRO_P>

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.hydro.ch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.hydro.ch">
<xs:import namespace="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="xsi.xsd"/>
<xs:element name="HYDRO_P">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:scada"/>
      <xs:element ref="ns1:field"/>
    </xs:sequence>
    <xs:attribute ref="xsi:schemaLocation" use="required"/>
  </xs:complexType>
</xs:element>
<xs:element name="scada">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:logicalDevice"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="logicalDevice">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:logicalNode"/>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
  </xs:complexType>
</xs:element>
<xs:element name="logicalNode">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:datatype"/>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
    <xs:attribute name="type" use="required" type="xs:NCName"/>
  </xs:complexType>
</xs:element>
<xs:element name="datatype">
  <xs:complexType>
    <xs:attribute name="name" use="required"/>
    <xs:attribute name="priority" use="required" type="xs:integer"/>
    <xs:attribute name="ref" use="required" type="xs:IDREF"/>
    <xs:attribute name="type" use="required" type="xs:NCName"/>
  </xs:complexType>
</xs:element>
<xs:element name="field">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:agent"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="agent">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:device"/>
    </xs:sequence>
    <xs:attribute name="driver" use="required"/>
    <xs:attribute name="id" use="required" type="xs:integer"/>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
    <xs:attribute name="port" use="required" type="xs:NCName"/>
    <xs:attribute name="portnb" use="required" type="xs:integer"/>
  </xs:complexType>
</xs:element>
<xs:element name="device">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:address"/>
      <xs:element ref="ns1:items"/>
    </xs:sequence>
    <xs:attribute name="devicetype" use="required"/>
    <xs:attribute name="id" use="required" type="xs:integer"/>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
  </xs:complexType>
</xs:element>
<xs:element name="items">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:collection"/>
      <xs:element ref="ns1:item"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="collection">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:item"/>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
  </xs:complexType>
</xs:element>
<xs:element name="address">
  <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="ns1:ip"/>
      <xs:element ref="ns1:modbus"/>
    </xs:choice>
  </xs:complexType>
</xs:element>
<xs:element name="ip">
  <xs:complexType>
    <xs:attribute name="address" use="required" type="xs:NMTOKEN"/>
  </xs:complexType>
</xs:element>
<xs:element name="modbus">
  <xs:complexType>
    <xs:attribute name="address" use="required" type="xs:integer"/>
  </xs:complexType>
</xs:element>
<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="ns1:description"/>
      <xs:element ref="ns1:address"/>
    </xs:sequence>
    <xs:attribute name="datatype" use="required" type="xs:NCName"/>
    <xs:attribute name="id" use="required" type="xs:ID"/>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
    <xs:attribute name="rights" use="required"/>
  </xs:complexType>
</xs:element>
<xs:element name="description" type="xs:NCName"/>
</xs:schema>

私はxsltでこのようなものを持ちたいです:

MTU.t_1.PLC1 の速度,$[MTU].AGENT1.DEVICE1.ITEM1 ...

私は次のようなものを試しました: XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fr="http://www.hydro.ch"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    version="2.0">
 <xsl:output method="text" indent="no"/>


    <xsl:template match="/">
        <xsl:apply-templates select="fr:HYDRO_P"/>
    </xsl:template>



 <xsl:template match="fr:HYDRO_P">

     <xsl:value-of select="fr:scada/fr:logicalDevice/@name"/>.
     <xsl:value-of select="fr:scada/fr:logicalDevice/fr:logicalNode/@name"/>.
     <xsl:value-of select="fr:scada/fr:logicalDevice/fr:logicalNode/fr:datatype/@name"/>,
     $[<xsl:value-of select="fr:scada/fr:logicalDevice/@name"/>].
     <xsl:value-of select="fr:scada/fr:logicalDevice/fr:logicalNode/fr:datatype/id(@ref)/ancestor::agent/@name"/>.
     <xsl:value-of select="fr:scada/fr:logicalDevice/fr:logicalNode/fr:datatype/id(@ref)/ancestor::device/@name"/>.
     <xsl:value-of select="fr:scada/fr:logicalDevice/fr:logicalNode/fr:datatype/id(@ref)/@name"/>

 </xsl:template>

</xsl:stylesheet>

しかし、id(@ref) 継ぎ目は機能しません...

XML ドキュメントから目的の出力を取得する方法を教えてください。

MTU.t_1.PLC1 の速度,$[MTU].AGENT1.DEVICE1.ITEM1 ...

4

1 に答える 1

0

xslt に小さな問題がいくつかあります。

まず最初にid()、xml ファイル (または dtd ファイル) で DOCTYPE 宣言を使用して固有のものを指定する必要がある xpath 関数を作成します。
フォームxpath unique-id :
要素ノードは一意の識別子 (ID) を持つ場合があります。これは、DTD でタイプ ID として宣言されている属性の値です。ドキュメント内の 2 つの要素が同じ一意の ID を持つことはできません。XML プロセッサが、ドキュメント内の 2 つの要素が同じ一意の ID を持っていると報告した場合 (ドキュメントが無効な場合にのみ発生する可能性があります)、ドキュメントの順序で 2 番目の要素は一意の ID を持たないものとして処理する必要があります。

何かのようなもの:

<!DOCTYPE HYDRO_P [
    <!ATTLIST item
       id     ID    #REQUIRED
    >
]>

このxpathを試すより:

<xsl:value-of select="id(fr:scada/fr:logicalDevice/fr:logicalNode/fr:datatype/@ref)/ancestor::fr:agent/@name"/> 

id 関数とエージェントへのパラメーターとしての参照へのパスは、マンスペース "fr" にも属します。

于 2013-06-20T09:33:43.443 に答える