2010-06-08 5 views
2

Je suis frappé d'un problème dans VB.Net obtenir XPath pour un élément XML comme indiqué ci-dessous:XPath quand un nœud racine et élément ont différents attributs espace Nom

<Parent xmlns:"http://www.sample.com">  
    <body>  
     <Child xmlns:"http://www.notsample.com"> 

      <element type="xyz"> ghghghghghg </element> 

     </Child>  
    </body> 
</Parent> 

J'ai besoin Xpath du « élément » en XML ci-dessus en utilisant VB.Net namespace Gestionnaire

pour le noeud « body » je l'ai fait et son travail, mais je ne pourrais pas faire la même chose à « élément »:

dim bodynode as XMLNode=XML.SelectSingleNode(//ns:body,nsmngr) 

où « nsmngr » est le namespacemanger créé par moi et « ns » est l'espace de nom du « nœud parent » (noeud qui le « corps » hérite) ajouté au gestionnaire d'espace de noms comme « ns »

Merci Kiran

+0

Bonne question (1). Voir ma réponse pour deux solutions différentes. :) –

Répondre

0

Compte tenu du code XML suivant :

<OuterElem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:test="http://www.w3.org/2001/XMLSchema-instance1" xmlns:test1="http://www.w3.org/2001/XMLSchema-instance1"> 
<test:parent> 
    <test1:child1>blabla1</test1:child1> 
    <test1:child2>blabla2</test1:child2> 
    <test:child2>blabla3</test:child2> 
</test:parent> 
<test1:child1>blabla4</test1:child1> 
</OuterElem> 

le XSLT suivant XSLT (1,0) des copies de tous les nœuds, sauf "test: parent/test1: child1":

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:test="http://www.w3.org/2001/XMLSchema-instance1" xmlns:test1="http://www.w3.org/2001/XMLSchema-instance1"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
     <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="test:parent/test1:child1"/> 
</xsl:stylesheet> 

Le résultat sera:

<OuterElem xmlns:test="http://www.w3.org/2001/XMLSchema-instance1" xmlns:test1="http://www.w3.org/2001/XMLSchema-instance1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <test:parent> 
     <test1:child2>blabla2</test1:child2> 
     <test:child2>blabla3</test:child2> 
    </test:parent> 
    <test1:child1>blabla4</test1:child1> 
</OuterElem> 
+0

Ce n'est pas une question XSLT, donc votre réponse n'est pas ce que vous voulez. –

+0

@ dimitre: Si vous regardez les exemples, vous verrez les 2 bindings d'espaces de noms et la façon de spécifier le xpath à un nœud appartenant à 2 espaces de noms différents: "test: parent/test1: child1" - donc je dirais qu'il répond la question – Ando

1

Il existe deux façons de construire l'expression XPath nécessaire:

  1. définir un second espace de noms de liaison avec NamespaceManager, dire ns2: lié à http://www.notsample.com. Ensuite, utilisez:

/*/ns:body/ns2:Child/ns2:element

  1. Ne pas utiliser les espaces de noms du tout:

/*/*[name()='body']/*[name()='Child']/*[name()='element']

Questions connexes