[xpath] namespace

oleg1331

Необходимо выбрать в документе все элементы <element> из определенного пространства имен. Как их выделить с помощью xpath? Т.е. например документ:
<books>
<n1:book xmlns:n1="n1" />
<n2:book xmlns:n2="n2" />
<n3:book xmlns:n3="n3" />
</books>

вот. и для каждого элемента book нужно запустить соответствующий обработчик <xsl:template>. как?

sany79

Например, так:

<xsl:template match="n1|book">
<xsl:copy-of select="."/>
</xsl:template>

oleg1331

не работает:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="//ns1|item">
<font color="red"><b><xsl:value-of select="." /></b></font>
</xsl:template>
<xsl:template match="//ns2|item">
<font color="yellow"><b><xsl:value-of select="." /></b></font>
</xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<site>
<panel>
<n1:item xmlns:n1="n1">hallo1</n1:item>
<n2:item xmlns:n2="n2">hallo2</n2:item>
</panel>
</site>

вообще | служит просто для разделения различных путей, к которым применяется данный шаблон. Мне же другое нужно. И вообще я, наверно, ввел в заблуждение здесь. Ведь n1 и n2 - это просто псевдонимы для наших пространств имен. А как ваш шаблон должен работать для пространств имен http://n1.ru и http://n2.ru? короче нет, такой шаблон не работает. Я пробовал еще через [@xmlns='...'] - тоже не получается

Dasar

должно быть так

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:n1="n1"
xmlns:n2="n2"
>
<xsl:template match="//n1:item">
<font color="red"><b><xsl:value-of select="." /></b></font>
</xsl:template>
<xsl:template match="//n2:item">
<font color="yellow"><b><xsl:value-of select="." /></b></font>
</xsl:template>
</xsl:stylesheet>

oleg701

Пишут тут два способа. Сам не проверял.
//x:booking[@unitCharge=50] where the prefix x is bound to the namespace "http://www.FicticiousTourismInterface/BookingService",
or equivalently,
//*[namespace-uri='http://www.FicticiousTourismInterface/BookingService" and local-name = 'booking' and @unitCharge=50]

oleg1331

а.. точно) работает. только я так и не понял, почему... что означает n1|item ?

Dasar

у меня двоеточие ':', а не палка '|' между n1 и item.
а двоеточие как раз и обозначает префикс namespace-а

sany79

Пардон, я ошибся, перепутав с CSS, там должно быть двоеточие вместо палочки.
А в твоём примере пространства имён обозначены по-разному: ns1 и n1.

oleg1331

пардон) точно. тогда все понятно становится. спасибо.
Оставить комментарий
Имя или ник:
Комментарий: