Префикс пространства имен отсутствует после XSLT-преобразования XML с использованием Apache Xalan - PullRequest
1 голос
/ 24 мая 2011

У меня следующий XML:

<?xml version="1.0"?>
    <abc:Element1 xmlns:abc="http://..../resources/abc/v2/"
         ...>
         <abc:Element2>
            <abc:Element3s>
                 <abc:Element4 name="name1"
                               resourceRef="name2"/>
            </abc:Element3s>
         </abc:Element2>

         <abc:Resources>
            <abc:Resource xsi:type="abc:Something"
                          name="name2"/>
         </abc:Resources>
     </abc:Element1>   

... и эта таблица стилей XSLT:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:abc="http://.../resources/abc/v2/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:template match="/">
     <checker name="something">
       <xsl:for-each select="abc:Element1/abc:Element2/abc:Element3s/abc:Element4">
        <xsl:variable name="resource" select="@resourceRef"/>
        <xsl:variable name="xsiType"><xsl:value-of select="//abc:Resource[@name=$resource]/@xsi:type"/></xsl:variable>
        <xsl:choose>
            <xsl:when test="$xsiType='abc:Something'">
               ...
            </xsl:when>
            <xsl:otherwise>
               ...
            </xsl:otherwise>
         </xsl:choose>
       </xsl:for-each>
     </checker>
   </xsl:template>
</xsl:stylesheet>

Я использую XALAN 2.7.1 с org.apache.xalan.xsltc.trax.TransformerFactoryImpl (также пытался с org.apache.xalan.processor.TransformerFactoryImpl -> тот же результат) для преобразования XML.

Я ожидаю, что следующая строка будет хранить abc: что-то в переменной xsiType .

<xsl:variable name="xsiType"><xsl:value-of select="//abc:Resource[@name=$resource]/@xsi:type"/></xsl:variable>

но, к сожалению, только Something (без префикса пространства имен) хранится в xsiType .Я подтвердил это, потому что

<xsl:when test="$xsiType='abc:Something'">

не соответствует действительности.

Я также преобразовал XMl, используя xsltproc , и полученный XML-код выглядит, как и ожидалось.Поэтому я ожидаю, что входная таблица стилей XML / XSLT будет правильной.Я предполагаю, что что-то не так с Xalan и его конфигурацией.

Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Это выглядит как проблема, характерная для Xalan.Однако это может быть проблемой с базовым парсером XML: парсер по умолчанию в Sun JDK имеет некоторые странные ошибки, в том числе некоторые, которые портят значения атрибутов.Всегда используйте версии Apache Xalan и Xerces, а не версии, поставляемые с JDK.И, конечно, если вы используете Xalan, то переключиться на Saxon практически без затрат, что дает вам все преимущества XSLT 2.0.

1 голос
/ 24 мая 2011

Ваш пример данных не является правильно сформированным, поэтому трудно сказать. Это может быть проблема с пространством имен. Вот очищенная версия вашего ввода и таблицы стилей, которая извлекает нужные вам данные:

<?xml version="1.0"?>
<abc:Element1
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:abc="http://resources/abc/v2">
    <abc:Element2>
        <abc:Element3s>
            <abc:Element4 name="name1" resourceRef="name2"/>
        </abc:Element3s>
    </abc:Element2>
    <abc:Resources>
        <abc:Resource xsi:type="abc:Something" name="name2"/>
    </abc:Resources>
</abc:Element1>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:abc="http://resources/abc/v2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    exclude-result-prefixes="abc xsi"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:variable name="resource" select="'name2'"/>
        <xsl:variable name="type"
            select="//abc:Resource[@name=$resource]/@xsi:type"/>
        <checker name="{ $type }"/>
    </xsl:template>
</xsl:stylesheet>

Это даст:

<?xml version="1.0"?>
<checker name="abc:Something"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...