2013-06-20 26 views
1

嗨第一原諒我的英語水平; d爲什麼id()在我的xslt中不起作用?

我以下的問題:

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:

PLC1的MTU.t_1.speed ,$ [MTU] .AGENT1.DEVICE1.ITEM1 ...

我tryed像: 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.speed PLC1的,得到需要的結果了$ [MTU] .AGENT1.DEVICE1.ITEM1 ...

回答

0

你的xslt有一些小問題。

首先確定xpath函數id()您需要通過xml文件(或dtd文件)中的DOCTYPE聲明指定唯一。
表格xpath unique-id
元素節點可以具有唯一的標識符(ID)。這是在DTD中聲明爲屬性類型ID的屬性的值。文檔中沒有兩個元素可能具有相同的唯一ID。如果XML處理器報告文檔中的兩個元素具有相同的唯一ID(只有在文檔無效的情況下才有可能),那麼文檔順序中的第二個元素必須被視爲不具有唯一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功能和代理的路徑也屬於manmspase 「FR」。

+0

謝謝hr_117它的工作原理!但是沒有必要在屬性上放置命名空間... – therg

+0

代理不是屬性,使用屬性的名稱空間將是'fr:agent/fr:@ name'。是的,這是沒有必要的。 –

+0

哦,我知道你在說什麼...... thx – therg