2009-12-30 4 views
1

Après avoir abandonné sur PHP, je suis en train d'extraire des données à partir du XML en utilisant XSLTXSLT pour la sélection des espaces de noms des attributs

Comment puis-je correspondre les données <jskit:attribute key="permalink"

j'ai vu une autre question similaire à propos de paires de valeurs de nom mais im une étape de cette

Mon xml est donnée ici xml source

Répondre

1

Tout d'abord, assurez-vous que tous les espaces de noms que vous souhaitez utiliser sont disponibles dans le xslt. Par exemple, définir des préfixes xmlns pour tous dans l'élément supérieur, comme ceci:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:jskit="http://purl.org/dc/elements/1.1/" 
> 
    ... xslt templates go here... 
</xsl:stylesheet> 

Après cela, vous pouvez utiliser le préfixe espace de noms jskit dans vos expressions XPath.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:jskit="http://purl.org/dc/elements/1.1/" 
> 
    <!-- match all items anywhere in the document --> 
    <xsl:template match="//item"> 
     <!-- get the "value" attribute of the "jskit:attribute" element 
       in the current item in case the "key" attribute is called "permalink" 
     --> 
     <xsl:value-of select="jskit:attribute[@key='permalink']/@value"/> 
     , <!-- comma separator, literal txt -->    
     <!-- get the "value" attribute of the "jskit:attribute" element 
       in the current item in case the "key" attribute is called "IP" 
     --> 
     <xsl:value-of select="jskit:attribute[@key='IP']/@value"/>  
    </xsl:template> 
</xsl:stylesheet> 

Les modèles et XPath vous devez écrire sont totalement dépendants des exigences de votre format de sortie souhaité et ce n'est pas facile de répondre en totalité si nous ne disposons pas que nformation

Mais disons que vous voulez insérer les données dans une base de données, vous pouvez ensuite générer des instructions SQL directement avec XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:jskit="http://purl.org/dc/elements/1.1/" 
> 
    <!-- make text output (SQL script) --> 
    <xsl:output 
     method="text" 
    /> 

    <!-- match all items anywhere in the document --> 
    <xsl:template match="//item"> 
     INSERT INTO myTable(permalink, IP) VALUES 
     ('<xsl:value-of select="jskit:attribute[@key='permalink']/@value"/>' 
     ,'<xsl:value-of select="jskit:attribute[@key='IP']/@value"/>'); 
    </xsl:template> 
</xsl:stylesheet> 

Cependant, pour faire ce genre de chose vraiment robuste, vous devez vous assurer que les valeurs qui se retrouvent dans l'instruction SQL ne contient aucune chaîne de limiteur. Si, par exemple, le lien permanent pouvait contenir un seul guillemet, cela générerait un SQL non valide car la citation unique de la valeur mettrait prématurément fin à la valeur SQL littérale de la chaîne.

Pour contrer cela, vous pouvez écrire un modèle qui traite de manière récursive les valeurs de texte pour échapper à ces personnages qui en ont besoin (en dehors de la citation et en fonction de votre base de données dont vous avez besoin pour échapper à d'autres personnages aussi)

Anothter approche serait d'utiliser le XSLT pour convertir les données dans un format que vous pouvez facilement analyser dans votre langue hôte. Supposons que vous utilisez PHP, alors vous pouvez utiliser XSLT pour convertir le format XML en format de fichier ini, l'analyser avec parse_ini_file(), puis utiliser PHP pour échapper/valider correctement les valeurs et ensuite effectuer les actions de base de données.

YMMV

0

les expressions XPath pour les noeuds en question sont les suivantes:

/rss/channel/item/jskit:attribute[@key='IP']/@value 

/rss/channel/item/jskit:attribute[@key='permalink']/@value 

/rss/channel/item/jskit:parent-guid 

Les deux premiers utilisent des prédicats pour sélectionner les nœuds qui ont une clé correspondante égale à «IP» ou «permalink». Le troisième est juste une expression normale sélectionnant un seul noeud. Pour pouvoir accéder à ces nœuds avec des espaces de noms, vous devez définir les préfixes d'espace de noms dans votre XSLT. Ceci est fait dans l'élément <xsl:stylesheet>. Pour cette application, vous pouvez simplement copier les déclarations de votre source XML.

Un exemple complet dans XSLT

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
    xmlns:jskit="http://purl.org/dc/elements/1.1/" 
    exclude-result-prefixes="atom media jskit dc"> 

    <xsl:template match="/"> 
     <ip> 
      <xsl:value-of 
       select="/rss/channel/item/jskit:attribute[@key='IP']/@value"/> 
     </ip> 
     <permalink> 
      <xsl:value-of 
       select="/rss/channel/item/jskit:attribute[@key='permalink']/@value"/> 
     </permalink> 
     <parent-guid> 
      <xsl:value-of 
       select="/rss/channel/item/jskit:parent-guid"/> 
     </parent-guid> 
    </xsl:template> 
</xsl:stylesheet> 

Pour fixer la feuille de style au fichier XML utiliser une instruction de traitement appelé xml-stylesheet

<?xml version="1.0"?> 
<?xml-stylesheet href="rss.xsl" type="text/xsl" ?> 
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
    xmlns:jskit="http://purl.org/dc/elements/1.1/" > 
+0

@peter .. thx tant pour l'exemple complet si je l'attache xsl au xml je reçois l'erreur erreur sur la ligne 1 à la colonne 25: Contenu supplémentaire à la fin de le document – vk123

+1

Le xslt va dans le fichier .xsl et le xml dans le fichier .xml. Pour attacher le xslt à un fichier XML, vous devez utiliser quelque chose comme ça

+0

merci Peter et Roland! Obtenir quelque chose qui fonctionne enfin! – vk123

0

Après avoir abandonné sur PHP, je suis en train d'extraire des données à partir du XML en utilisant XSLT

Qu'est-ce à abandonner? PHP a un bon support pour XML. Vous pouvez utiliser DomXPath pour interroger dans un document XML. Utilisez d'abord registerNamespace, pour pouvoir interroger un attribut namespaced. Par exemple .:

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$xpath = new DOMXPath($doc); 
$xpath->registerNamespace("jskit", "http://purl.org/dc/elements/1.1/"); 
$query = "//jskit:attribute[@key='permalink']"; 
foreach ($xpath->evaluate($query) as $node) { 
    echo $node, "\n"; 
} 
+0

Cette réponse serait parfaite dans la question d'origine http://stackoverflow.com/questions/1977072/rss-xml-namespace-confusion –

Questions connexes