2013-06-20 2 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:

MTU.t_1.speed of PLC1 $ [МТУ] .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> 

но идентификатор (@ref) швы не работать ...

нужна помощь, как я могу получить желаемый результат из документа XML

MTU.t_1.speed из PLC1, $ [МТ] .AGENT1.DEVICE1.ITEM1 ...

ответ

0

В вашем xslt есть небольшие проблемы.

Прежде всего, сделайте функцию xpath id(), вам нужно указать уникальную декларацию DOCTYPE в вашем XML-файле (или файле dtd).
Форма xpath unique-id:
Узел элемента может иметь уникальный идентификатор (ID). Это значение атрибута, объявленного в DTD как идентификатор типа. Никакие два элемента в документе не могут иметь одинаковый уникальный идентификатор. Если XML-процессор сообщает два элемента в документе как имеющие тот же уникальный идентификатор (который возможен только в том случае, если документ недействителен), то второй элемент в порядке документа должен рассматриваться как не имеющий уникальный идентификатор.

Что-то вроде:

<!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"/> 

Путь к иому как к параметру Я функции ид и агент принадлежит также manmspase "FR".

+0

спасибо hr_117 Это работает! но нет необходимости помещать пространство имен в атрибут ... – therg

+0

Агент не является атрибутом, для использования пространства имен для атрибута будет 'fr: agent/fr: @ name'. И да, в этом нет необходимости. –

+0

oh okey я видел, где вы имеете в виду ... thx – therg

Смежные вопросы