Не може да се прави заявка с помощта на XPath, когато елементът от данни има атрибут **xmlns=**

Имам затруднения да направя запитване за стойността на стойност на елемент от данни, когато атрибутът xmlns="..." в него е родителски елемент. Следният пример е част от SOAP отговор и искам да получа стойността на собственото и фамилното му име, като използвам XPATH /PartyInq_v2Response/PartyInq_v2Rs_Type/*[local-name()="person"]/firstName '. Но не връща нищо. Може да върне стойност, ако съм премахнал всички xmlns="..." от xml преди заявката. Някой знае ли как да потърси директно име от примера?

<PartyInq_v2Response xmlns="urn:Somewhere.Int" xmlns:q2="http://SomewhereOps.v20120719" xmlns:q10="http://SomewhereTypes.v20120719.GenericTypes">
    <PartyInq_v2Rs_Type>
        <q2:person>
            <firstName xmlns="http://SomewhereTypes.v20120719.Types">somebody</firstName>
            <lastName xmlns="http://SomewhereTypes.v20120719.Types">nobody</lastName>           
        </q2:person>
    </PartyInq_v2Rs_Type>
</PartyInq_v2Response>

Благодаря

Lu


person Yadong    schedule 03.05.2013    source източник


Отговори (1)


Не е ясно какъв xslt процесор използвате. Но трябва да направите всички използвани пространства от имена известни на xlst.

Следният xlst ще направи:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:s="urn:Somewhere.Int" 
            xmlns:q2="http://SomewhereOps.v20120719"
            xmlns:q10="http://SomewhereTypes.v20120719.GenericTypes"
            xmlns:t="http://SomewhereTypes.v20120719.Types">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/" >
        <xsl:value-of select="/s:PartyInq_v2Response/s:PartyInq_v2Rs_Type/q2:person/t:firstName"/>
    </xsl:template>
</xsl:stylesheet>

Ако url адресът на пространството от имена не е известен, можете да използвате local-name().

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns:s="urn:Somewhere.Int" >
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/" >
        <xsl:value-of select="/s:PartyInq_v2Response/*[local-name() = 'PartyInq_v2Rs_Type']/*[local-name() = 'person']/*[local-name()='firstName']"/>
    </xsl:template>
</xsl:stylesheet>
person hr_117    schedule 03.05.2013
comment
Благодаря ти за помощта. Използвам XMLSpy за тестване. Има ли начин да игнорирате пространствата от имена, вместо да ги дефинирате в xlst? тъй като използваме инструмент за генериране на SOAP схема, която ще се използва за създаване на SOAP отговор на съобщение. Всеки път, когато пресъздаваме тези схеми, вътрешното пространство от имена (напр. q10, q2) може да се различава всеки път по време на регенериране на схеми, т.е. q10 се промени на q20. което ще затрудни много дефинирането (твърд код) на пространството от имена в моя xslt. - person Yadong; 03.05.2013
comment
Променен ли е само префиксът или и URL адресът? Ако префиксът е променен, това няма значение. Ако url адресът е променен, можете да използвате local-name, както вече сте направили. (Вижте актуализация.) - person hr_117; 04.05.2013
comment
Благодаря ви hr_117 :) Но докато xmlns=blabla в атрибута XML as, Local-name() не работи, поне в XMLSPy. Ето защо публикувам въпрос тук. Ако премахна тези атрибути, няма значение дали има префикс или не, със сигурност ще работи. Така че може би трябва да използвам първото, което ми показахте. - person Yadong; 04.05.2013