Пространство имен XML XSL - PullRequest
       1

Пространство имен XML XSL

0 голосов
/ 06 декабря 2011

Я создаю отчет из автоматически сгенерированного файла XML с использованием XSL.В этом файле мой корневой узел содержит метку времени в качестве пространства имен.Когда я генерирую свой отчет HTML с отметкой времени, включенной в файл XML, я не могу извлечь атрибут в узле.Когда я его удаляю, все работает нормально.Может кто-нибудь пролить немного света на эту тему.Спасибо.

с отметкой времени:

<AdminReports xmlns="30/11/2011 09:25:58">

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE AdminReports []>
<?xml-stylesheet type="text/xsl" href="AdminReport.xsl"?>

<AdminReports xmlns="30/11/2011 09:25:58">
  <AdminReport ID="1">
  </AdminReport >
</AdminReports>

Ответы [ 3 ]

0 голосов
/ 06 декабря 2011

xmlns="..." - это не объявление атрибута, а объявление пространства имен.Это означает, что элемент AdminReports находится в пространстве имен.

Я предполагаю, что в вашем XSL нет объявления пространства имен, соответствующего следующему URI "30/11/2011 09:25:58".Следовательно, XSL не дает ожидаемого результата.Если у вас получился хороший результат после удаления объявления пространства имен, это означает, что ваш XSL работает для XML без пространства имен.

Перед преобразованием вы можете добавить первый XSL для удаления пространств имен.Вот, например:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:for-each select="@*">
                <xsl:attribute name="{local-name()}" >
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>    
</xsl:stylesheet>

Другой альтернативой может быть изменение вашего XSL, чтобы он стал «осведомленным о пространстве имен».

0 голосов
/ 06 декабря 2011

Поскольку пространство имен-uri для пространства имен по умолчанию - это временная метка - это означает, что она потенциально различна для каждого автоматически сгенерированного документа, нет способа определить «это» пространство имен в коде XSLT .

Существует другой способ - не использовать нефиксированные имена напрямую, а сравнивать их с name() элемента:

/*/*[name()='AdminReport']/@ID

правильно выбираетID атрибут любого элемента с именем «AdminReport» (относительно того, к какому пространству имен он принадлежит), который является дочерним элементом верхнего элемента XML-документа.

Вот полный пример XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select=
    "/*/*[name()='AdminReport']/@ID"/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному XML-документу :

<AdminReports xmlns="30/11/2011 09:25:58">
    <AdminReport ID="1">
    </AdminReport >
</AdminReports>

требуемый результат correst :

1
0 голосов
/ 06 декабря 2011

Это значение не должно храниться в xmlns, но вы можете получить к нему доступ в XPath 2.0 с помощью namespace-uri():

 namespace-uri(/*:AdminReports)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...