2013-06-10 3 views
5

У меня есть xml, сгенерированный веб-сервисом на основе openerp, он содержит префикс pp для многих элементов. Я хочу преобразовать этот xml-файл в другой xml, используя xslt, выбрав много элементов. Когда я пытаюсь выполнить преобразование, он показывает мне ошибку «префикс xsl для элемента не связан» для префикса pp. Я не могу объявить pp, как описано во многих ответах, как я могу игнорировать использование этого префикса?XSLT префикс xsl для элемента не связан

+0

«Я не могу объявить С., как это описано во многих ответах» - почему бы и нет? Правильный подход к этой проблеме заключается в сопоставлении URI с подходящим префиксом в таблице стилей. –

+0

, потому что у меня нет URI для этого префикса, его автоматически генерируется с openerp. – Rida

ответ

0

Я нашел решение этой проблемы. мы можем использовать этот XSLT-преобразование, чтобы игнорировать все пространства имен и префиксы в нашем файле XML:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*|node()[not(self::*)]"> 
    <xsl:copy/> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 
1

XPath предоставляет синтаксис pp:* для выбора всех элементов/атрибутов с определенным URI пространства имен независимо от их локальных имен, но не (напрямую), чтобы выбрать все элементы/атрибуты с определенным локальным именем независимо от пространства имен. Если вы не знаете заранее, что пространство имен URI будет то вместо

pp:foo/pp:bar 

вы должны использовать трюки, как

*[local-name() = 'foo']/*[local-name() = 'bar'] 

Тот факт, что документ использует «рр» как префикс не имеет значения, что важно для XPath и XSLT (и для любых других инструментов XML-обработки, поддерживающих пространство имен) - это локальное имя элемента и его URI пространства имен. Префикс - это просто устройство, позволяющее синтаксическому анализатору присоединить правильный URI пространства имен к каждому узлу.

+0

Где я могу написать эту строку * [local-name() = 'foo']/* [local-name() = 'bar'] , потому что я не могу контролировать, как генерируется XML-файл, этот XSLT будет использоваться в ESB, поэтому это будет просто сообщение, и я буду применять этот XSLT на нем. – Rida

+0

@Rida вы должны использовать этот трюк во всех выражениях 'select' и' match', которые относятся к элементам с пространством имен переменных. Невозможно быть более конкретным, не видя примера XML и вашего текущего XSLT. –

+0

Спасибо за ваш ответ Я нашел решение моей проблемы – Rida

Смежные вопросы