解析xslt中的引用

时间:2015-08-26 14:05:02

标签: xml xslt xsd

我试图在xslt中解析id / idref引用。 不幸的是,没有显示数据......我做错了吗?

由于我将projektId定义为类型ID,我应该可以使用id(...) - 函数,还是我错了?

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Projekt.xsl"?>
<school xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="Projekt.xsd">
    <personen>
        <person id="1">
            <name>a</name>
            <kuerzel>a</kuerzel>
            <email>a@a.ch</email>
            <projektRef projektIdRef="p1" />
        </person>
        <person id="2">
            <name>b</name>
            <kuerzel>b</kuerzel>
            <email>b@b.ch</email>
            <projektRef projektIdRef="p1" />
        </person>
        <person id="3">
            <name>c</name>
            <kuerzel>c</kuerzel>
            <email>c@c.ch</email>
            <projektRef projektIdRef="p2" />
        </person>
    </personen>

    <projekte>
        <projekt projektId="p1">
            <name>Projekt 1</name>
        </projekt>
        <projekt projektId="p2">
            <name>Projekt 2</name>
        </projekt>
    </projekte>
</school>

XSD

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="school">
  <xs:complexType>
    <xs:sequence>
        <xs:element name="personen" maxOccurs="unbounded">
            <xs:complexType>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:sequence>
                    <xs:element name="person">
                        <xs:complexType>
                            <xs:sequence>        
                                <xs:element name="name" type="xs:string"/>
                                <xs:element name="kuerzel" type="xs:string"/>
                                <xs:element name="email" type="xs:string"/>
                                <xs:element name="projektRef">
                                    <xs:complexType>
                                        <xs:attribute name="projektIdRef" type="xs:IDREF" />
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                            <xs:attribute name="id" type="xs:integer" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
              </xs:choice>
            </xs:complexType>
        </xs:element>

        <xs:element name="projekte" maxOccurs="unbounded">
            <xs:complexType>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:sequence>
                        <xs:element name="projekt">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="name" type="xs:string" />
                                </xs:sequence>
                                <xs:attribute name="projektId" type="xs:ID" />
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:choice>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:df="http://www.w3schools.com">
<xsl:key name="projectKey" match="df:projekte/projekt" use="@projektId" />

<xsl:template match="/">
  <html>
  <body>
  <h2>School</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">Name</th>
        <th style="text-align:left">Kürzel</th>
        <th style="text-align:left">Email</th>
        <th style="text-align:left">Link</th>
        <th style="text-align:left">Project</th>
      </tr>
      <xsl:for-each select="df:school/df:personen/df:person">
      <tr>
        <td><xsl:value-of select="df:name"/></td>
        <td><xsl:value-of select="df:kuerzel"/></td>
        <td><a href="mailto:{df:email}"><xsl:value-of select="df:email" /></a></td>
        <td><img src="http://test.com/portraet/images/{df:kuerzel}.jpg" width="100px" height="100px"/></td>
        <td><xsl:value-of select="id(projekte/@projektId)/name" /></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

我也尝试使用以下功能:

<td><xsl:value-of select="key('projektKey', @projektId)/name" /></td>

但我也没有显示任何数据......

我做错了什么?

提前致谢

2 个答案:

答案 0 :(得分:1)

XSLT 1.0没有任何模式定义类型支持,您需要定义DTD并确保使用支持和解析外部DTD的XML解析器和XSLT处理器(例如浏览器中的XSLT处理器和#) 39; t(Mozilla)执行或仅在请求时执行(使用MSXML的IE))以便能够使用id函数。

对于您尝试使用架构,schemaLocation属性采用namespace-URI schema-URI对,而不是单个URI。

要使用密钥,您需要始终如一地设置它:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:df="http://www.w3schools.com"
  exclude-result-prefixes="df">
<xsl:key name="projectKey" match="df:projekte/df:projekt" use="@projektId" />

<xsl:template match="/">
  <html>
  <body>
  <h2>School</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">Name</th>
        <th style="text-align:left">Kürzel</th>
        <th style="text-align:left">Email</th>
        <th style="text-align:left">Link</th>
        <th style="text-align:left">Project</th>
      </tr>
      <xsl:for-each select="df:school/df:personen/df:person">
      <tr>
        <td><xsl:value-of select="df:name"/></td>
        <td><xsl:value-of select="df:kuerzel"/></td>
        <td><a href="mailto:{df:email}"><xsl:value-of select="df:email" /></a></td>
        <td><img src="http://pd.zhaw.ch/portraet/images/{df:kuerzel}.jpg" width="100px" height="100px"/></td>
        <td><xsl:value-of select="key('projectKey', df:projektRef/@projektIdRef)/df:name" /></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

我不确定哪个XSLT 1.0处理器(如果有的话)支持id()功能(并且 - 正如Martin Honnen指出的那样 - 它需要DTD,而不是XSD)。

关于使用密钥,您有几个语法错误。你的密钥应该是:

<xsl:key name="projectKey" match="df:projekt" use="@projektId" />

你需要将其称为:

<xsl:value-of select="key('projectKey', df:projektRef/@projektIdRef)/df:name" />

另请注意,df:zhaw必须为df:school