用于提取ref-data的xslt-transformation几乎没有提取

时间:2017-02-11 17:13:05

标签: xml xslt rdf

来自以下文件:

<!--?xml version="1.0" encoding="UTF-8"?-->
<html>
 <head> 
  <title>ERKLAERUNG</title> 

 </head> 
 <body> 
  <h1>Erklärung</h1> 

  <p>Ich kenne einen Herrn <span class="vcard"> <span class="fn">Henry 
  Riedel</span> (<i class="nick">hrick</i>) , der in einer <span 
  class="org">Hauschuhfirma</span> arbeitet. Seine Telefonnummer ( <span   
  class="tel"> <i class="type">home</i>) ist: <span 
  class="value">+4.444.444.4442</span> </span> </span> Er ist mir als sehr 
  zuverlässiger Kollege in Erinnerung. Seine Aufgaben hat er stets   
  pflichtgemäß 
  erfüllt. Er war stets hilfsbereit und hat seine Kollegen nach besten 
  Kräften 
  unterstützt. 
  </p> 
  <p>Außerdem ist mir ein Herr <span class="vcard"> <span class="fn">Peter 
  Liebig</span> (<i class="nick">pitty</i>) bekannt, der an der <a 
  class="org" href="http://www.tu-chemnitz.de">TU Chemnitz</a> arbeitet. 
  Seine Telefonnummer ( <span class="tel"> <i class="type">home</i>) ist: 
  <span class="value">+7.777.777.7777.</span> </span> </span> Auch er hat 
  stets seine Pflicht erüllt, obwohl er manchmal zu spät zur Arbeit kam. Er 
  hst sich bemüht, diese Ausfallzeiten nachzuarbeiten. </p> 
  <p>Ich kennen aber keinen Herrn <span class="vcard"> <span class="fn">Ralph   
  Schneider</span>. (<i class="nick">Ralphy</i>) Ich habe lediglich über 
  Dritte erfahren, dass er bei <a class="org" 
  href="http://www.google.de">Google</a> beschäftigt sein soll. </span> Ich 
  muss energisch bestreiten, diesen Mitarbeiter zu kennen. Ich habe zwar über 
  ihn reden hören, aber ich habe in nie getroffen und auch sonst keinen 
  Kontakt zu ihm gehabt.</p> 
  <p>Auch Herrn <span class="vcard"> <span class="fn">Reiner Kuster</span> 
  kenne ich nur flüchtig. </span> </p> 
  </body>
  </html>

我想提取某些数据并将它们存储为rdf。为此我写了以下xslt-code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"   
xmlns:vc="http://example.org/vcard#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:h="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="/">
    <rdf:RDF xmlns:vc="http://example.org/vcard#"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:h="http://www.w3.org/1999/xhtml">

        <xsl:apply-templates select="*[@class='vcard']"/>

    </rdf:RDF>
</xsl:template>

<xsl:template match="*[@class='vcard']">
    <rdf:Description> 
        <xsl:attribute name="rdf:about">
            <xsl:value-of select="concat('vc:vcard_id', position() - 1)"/>
        </xsl:attribute>
        <xsl:if test=".//*[@class='fn']">
            <vc:hasName>
                <xsl:value-of select=".//*[@class='fn']"/>
            </vc:hasName>
        </xsl:if>
        <xsl:if test=".//*[@class='nick']">
            <vc:hasNickName>
                <xsl:value-of select=".//*[@class='nick']"/>
            </vc:hasNickName>
        </xsl:if>
        <xsl:if test=".//*[@class='tel']/*[@class='value']">
            <vc:phone>
                <xsl:value-of select=".//*[@class='tel']/*[@class='value']"/>
            </vc:phone>
        </xsl:if>
    </rdf:Description>
</xsl:template>

但不是给我想要的输出,如下所示:

<rdf:RDF xmlns:vc="http://example.org/vcard#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:h="http://www.w3.org/1999/xhtml">
   <rdf:Description rdf:about="vc:vcard_id0">
   <vc:hasName>Henry Riedel</vc:hasName>
   <vc:hasNickName>hrick</vc:hasNickName>
   <vc:phone>+4.444.444.4442</vc:phone>
</rdf:Description>

<rdf:Description rdf:about="vc:vcard_id1">
   <vc:hasName>Peter Liebig</vc:hasName>
   <vc:hasNickName>pitty</vc:hasNickName>
   <vc:phone>+7.777.777.7777.</vc:phone>
</rdf:Description>

<rdf:Description rdf:about="vc:vcard_id2">
   <vc:hasName>Ralph Schneider</vc:hasName>
   <vc:hasNickName>Ralphy</vc:hasNickName>
</rdf:Description>

<rdf:Description rdf:about="vc:vcard_id3">
   <vc:hasName>Reiner Kuster</vc:hasName>
</rdf:Description>

</rdf:RDF>

...运行xslt-transformation只给出了以下输出:

<?xml version="1.0" encoding="UTF-8"?><rdf:RDF 
xmlns:vc="http://example.org/vcard#" xmlns:rdf="http://www.w3.org/1999/02/22-  
rdf-syntax-ns#" xmlns:h="http://www.w3.org/1999/xhtml"/>

到目前为止,我已经专门使用xslt将xml转换为html。所以我的猜测是我的错误与此任务的rdf方面有关。

当我第一次尝试运行xslt转换时,我收到以下错误消息:

The prefix "rdf" for element "rdf:Description" is not bound. 

然后我包含了目标rdf文件的命名空间定义(即由转换创建的rdf文件),错误消息消失了。 但是,转换的输出几乎不包含任何数据。 我不知道自己做错了什么。如果有人知道,我会感谢你的回答。

1 个答案:

答案 0 :(得分:4)

指示:

<xsl:apply-templates select="*[@class='vcard']"/>

正在寻找当前节点的,其中class属性的值为“vcard”。由于当前节点是根/节点(其唯一子节点是根html元素),因此找不到这样的子节点。尝试将其更改为:

<xsl:apply-templates select="//*[@class='vcard']"/>

将在整个文档中的任何级别查找具有此类属性的元素。