XPath, когда корневой узел и элемент имеют разные атрибуты пространства имен - PullRequest
2 голосов
/ 08 июня 2010

Я столкнулся с проблемой в VB.Net, получающей Xpath для элемента XML, как показано ниже:

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

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

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

Мне нужен Xpath "элемента" в приведенном выше XML с помощью VB.Net NameSpace Manager

Для узла "body", который я сделал, и он работает, но я не мог сделать то же самое с "element":

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

где "nsmngr" - это созданный мной менеджер пространства имен, а "ns" - это пространство имен "родительского узла" (который наследует узел "body"), добавленного в диспетчер пространства имен как "ns"

Спасибо Киран

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Существует два разных способа построения необходимого выражения XPath :

  1. Определить второе связывание пространства имен с NamespaceManager, скажем ns2:, привязанным к http://www.notsample.com Затем используйте:

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

  1. Не использовать пространства имен вообще :

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

0 голосов
/ 08 июня 2010

С учетом следующего XML:

<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>   

следующий xslt (xslt 1.0) копирует все узлы, кроме "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>

Результат будет:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...