2010-02-27 6 views
2

Je veux convertir le fichier RDF/XML en une table de 3 colonnes, à savoir "Sujet" "Prédicat" et "Objet", ils sont connus comme des triplets RDF.sortie du littéral encapsulé XML en utilisant XSLT

le fichier RDF/XML est comme indiqué ci-dessous:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:h="http://www.w3.org/1999/xhtml"> 
    <rdf:Description rdf:about="http://www.w3.org/TR/2004/REC-rdf-mt-20040210/"> 
    <dc:title xmlns:dc="http://purl.org/dc/elements/1.1/">RDF Semantics - W3C Recommendation 10 February 2004</dc:title> 
    </rdf:Description> 
    <rdf:Description rdf:about="http://www.w3.org/TR/2004/REC-rdf-mt-20040210/"> 
    <dc:creator rdf:resource="#a1" xmlns:dc="http://purl.org/dc/elements/1.1/" /> 
    </rdf:Description> 
    <rdf:Description rdf:about="#a1"> 
    <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person" /> 
    </rdf:Description> 
    <rdf:Description rdf:about="#a1"> 
    <foaf:name xmlns:foaf="http://xmlns.com/foaf/0.1/">Patrick Hayes</foaf:name> 
    </rdf:Description> 
    <rdf:Description rdf:about="#a1"> 
    <foaf:homepage rdf:resource="http://www.ihmc.us/users/user.php?UserID=42" xmlns:foaf="http://xmlns.com/foaf/0.1/" /> 
    </rdf:Description> 
</rdf:RDF> 

et XSLT j'ai créé:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
<xsl:template match="/"> 
<html> 
<body> 

    <table border="1"> 
    <tr bgcolor="#5d7b9d" > 
     <th style="color: white">Subject</th> 
     <th style="color: white">Predicate</th> 
     <th style="color: white">Object</th> 
    </tr> 


    <xsl:for-each select="rdf:RDF/rdf:Description"> 
    <tr> 

     <td><xsl:value-of select="@rdf:about"/></td> 

<xsl:for-each select="*"> 
    <td><xsl:value-of select="name()"/></td> 
    <td><xsl:value-of select="@rdf:resource"/> 
     <xsl:value-of select="//*/rdf:Description"/> 
    </td> 
</xsl:for-each> 

    </tr> 
    </xsl:for-each> 
    </table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

via XSLT, je suis en mesure de produire des résultats corrects pour le sujet , Prédicat, mais pas pour Objet, car certains objets sont littéralement encapsulés dans des éléments XML. J'ai essayé d'utiliser le xsl: valeur-de select = "// */rdf: Description"/mais il renvoie juste tous les littéraux du document. S'il vous plaît, aidez, merci.

+0

Toute expression XPath qui commence par ' // 'va visiter tous les nœuds de l'arbre source. –

+0

@Robert: Sans avertissement que ce comportement va être * lent *, les citoyens sans méfiance pourraient demander "Alors quoi?". – Tomalak

+0

La performance est toujours difficile à faire des déclarations absolues sur, puisque la réponse évidente est "je l'ai testé, et ce n'était pas lent." Mais oui, la lenteur est la préoccupation. –

Répondre

2

<xsl:value-of select="*/."/> ou <xsl:value-of select="*/text()"/> devrait faire l'affaire, comme vous êtes dans le cadre d'une description et vous recherchez le contenu de la description.

Les deux sélections renvoient la concaténation de tous les textes à l'intérieur des éléments enfants. Si vous avez une structure dans vos éléments Description, vous devrez peut-être ajuster le style pour l'incorporer.

En plus de style « xsl Afine », c.-à-ne pas utiliser pour-chaque boucle, mais tempates la feuille de style ressemblerait à ceci:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
    <xsl:output method="html"/> 
    <xsl:template match="/"> 
     <html> 
      <body> 

       <table border="1"> 
        <tr bgcolor="#5d7b9d" > 
         <th style="color: white">Subject</th> 
         <th style="color: white">Predicate</th> 
         <th style="color: white">Object</th> 
        </tr> 

        <xsl:apply-templates select="rdf:RDF/rdf:Description"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="rdf:RDF/rdf:Description"> 
     <tr> 
      <td> 
       <xsl:value-of select="@rdf:about"/> 
      </td> 
      <td> 
       <xsl:value-of select="name()"/> 
      </td> 
      <td> 
       <xsl:choose> 
        <xsl:when test="*/@rdf:resource"> 
        <xsl:value-of select="*/."/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="*/."/> 
       </xsl:otherwise> 
      </xsl:choose> 
      </td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

Dans cette feuille de style, à mon humble avis, il devient plus clair quelle est la portée réelle de l'évaluation.

Si vous voulez être sûr que seul soit la ressource ou le contenu est affiché, et aussi faire face à de multiples éléments, vous pouvez modifier la feuille de style ci-dessus comme suit:

<xsl:template match="rdf:RDF/rdf:Description"> 
    <tr> 
     <td> 
      <xsl:value-of select="@rdf:about"/> 
     </td> 
     <td> 
      <xsl:value-of select="name()"/> 
     </td> 
     <td> 
      <xsl:apply-templates select="rdf:RDF/rdf:Description/*"/> 
     </td> 
    </tr> 
</xsl:template> 

<xsl:template match="rdf:RDF/rdf:Description/*"> 
    <!-- implements either or --> 
    <xsl:choose> 
     <xsl:when test="*/@rdf:resource"> 
      <xsl:value-of select="*/."/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="*/."/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

Cela fonctionne enfin, merci beaucoup! – louis

+0

Alors ce serait bien d'accepter la réponse. – AxelEckenberger

+0

Quelle est la différence entre vos alternatives ''? – Tomalak

Questions connexes