У меня следующий 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 и его конфигурацией.
Кто-нибудь может помочь?