xsl: copy-of Не копирует узлы, когда корневой элемент определяет xmlns [duplicate]

Вы можете попробовать использовать модуль glob

import glob

for filename in glob.iglob('/foobar/*.asm'):
     print('/foobar/%s' % filename)

51
задан Larry 31 August 2009 в 17:47
поделиться

3 ответа

Вам нужно объявить пространство имен в XSLT и использовать его в выражениях XPath. Например ::

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

Обратите внимание, что вы должны предоставить некоторый префикс, если вы хотите ссылаться на элементы из этого пространства имен в XPath. Хотя вы можете просто сделать xmlns="..." без префикса, и он будет работать для литеральных элементов результата, он не будет работать для XPath - в XPath, неподписанное имя всегда считается в пространстве имен с пустым URI, независимо от xmlns="..." в области.

56
ответ дан Pavel Minaev 27 August 2018 в 20:46
поделиться
  • 1
    Спасибо за ответ. Это похоже на то, что я нашел в Интернете, но он не работает. Мой вывод XML по-прежнему не работает должным образом. Если я удалю пространство имен по умолчанию из исходного XML, тогда вывод XML выглядит отлично. Мое приложение, использующее перевод XSLT, является приложением .NET 2.0, если это имеет значение. – Larry 28 August 2009 в 00:09
  • 2
    Пожалуйста, покажите свой XLST, который не работает. Трудно сказать ничего более определенного, не видя этого. То, что вы описываете, по-прежнему звучит так, будто вы пропустили квалификатор пространства имен somwhere . Например, имейте в виду, что вам нужно повторить его для каждого шага XPath, то есть /my:MyRoot/my:foo/my:bar. – Pavel Minaev 28 August 2009 в 00:22
  • 3
    Действительно полезная заметка о необходимости префикса. Это заставило меня проверить спецификации. Похоже, XPath будет уважать пространство имен по умолчанию, если оно присутствует, но XSLT явно исключает пространство имен по умолчанию из области видимости w3.org/TR/xslt#section-Expressions – Dominic Cronin 1 September 2014 в 16:23
  • 4
    @PavelMinaev: Я использовал /my:MyRoot в моем xPath, так что совпадение с шаблоном выглядит следующим образом: <xsl:template match="/my:MyRoot"> - так что такое MyRoot - это зарезервированное имя в XSLT? – Our Man in Bananas 2 September 2014 в 15:27
  • 5
    Нет, это просто имя элемента. Вы должны использовать все, что есть имя внешнего элемента для вашего XML. – Pavel Minaev 4 September 2014 в 18:09

Если вы используете XSLT 2.0, укажите xpath-default-namespace="http://www.example.com" в разделе stylesheet.

23
ответ дан Daniel Haley 27 August 2018 в 20:46
поделиться

Если это была проблема с пространством имен, есть возможность попытаться изменить две вещи в файле xslt:

  • добавить определение «моего» пространства имен в xsl: tagheet tag
  • использовать префикс «my:» при вызове элементов при перемещении xml-файла.

result

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>
3
ответ дан potame 27 August 2018 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: