Я вытягиваю то, что осталось от моих волос, пытаясь получить простой внешний интерфейс, работающий с использованием Saxon 9.1.0.7.XSLT 2.0 Внешний поиск с использованием ключа() и документа()
У меня есть простой исходный файл dummy.xml:
<something>
<monkey>
<genrecode>AAA</genrecode>
</monkey>
<monkey>
<genrecode>BBB</genrecode>
</monkey>
<monkey>
<genrecode>ZZZ</genrecode>
</monkey>
<monkey>
<genrecode>ZER</genrecode>
</monkey>
</something>
Затем файл перекодировки GenreSet_124.xml:
<GetGenreMappingObjectsResponse>
<tuple>
<old>
<GenreMapping DepartmentCode="AAA"
DepartmentName="AND - NEWS AND CURRENT AFFAIRS"
Genre="10 - NEWS"/>
</old>
</tuple>
<tuple>
<old>
<GenreMapping DepartmentCode="BBB"
DepartmentName="AND - NEWS AND CURRENT AFFAIRS"
Genre="11 - NEWS"/>
</old>
</tuple>
... lots more
</GetGenreMappingObjectsResponse>
Что я m, пытающийся достичь, - это просто получить «Жанр «значение, основанное на значении« DepartmentCode ».
Так что мой XSL выглядит следующим образом:
...
<!-- Set up the genre lookup key -->
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>
<xsl:variable name="lookupDoc" select="document('GenreSet_124.xml')"/>
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<xsl:apply-templates select="$lookupDoc">
<xsl:with-param name="curr-label" select="genrecode"/>
</xsl:apply-templates>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template>
<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select="key('genre-lookup', $curr-genrecode)/@Genre"/>
</xsl:template>
...
Проблема, что у меня есть, что я ничего не получаю обратно. В настоящее время я просто получить
<?xml version="1.0" encoding="UTF-8"?>
<stuff>
<Genre/>
<Genre/>
<Genre/>
<Genre/>
</stuff>
Я переместил все данные подстановок быть атрибутами GenreMapping, ранее в качестве дочерних элементов GenreMapping всякий раз, когда я вошел в матч шаблон = «GetGenreMappingObjectsResponse» это просто напечатать бы из всего текста из любого GenreMapping (DepartmentCode, DepartmentName, Жанр)!
Я не могу для жизни меня выяснить, что я делаю неправильно. Любая помощь или предложения были бы весьма признательны.
Вы можете найти текущую фактическую XSLT листинг:.
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Define the global parameters -->
<xsl:param name="TransformationID"/>
<xsl:param name="TransformationType"/>
<!-- Specify that XML is the desired output type -->
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<!-- Set up the genre matching capability -->
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>
<xsl:variable name="documentPath"><xsl:value-of select="concat('GenreSet_',$TransformationID,'.xml')"/></xsl:variable>
<xsl:variable name="lookupDoc" select="document($documentPath)"/>
<!-- Start the first match on the Root level -->
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<xsl:apply-templates select="$lookupDoc/*">
<xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
</xsl:apply-templates>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template >
<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select="key('genre-lookup', $curr-genrecode, $lookupDoc)/@Genre"/>
</xsl:template>
</xsl:stylesheet>
TransformationID является все дни 124 (так открыт правильный файл поиска Тип это просто имя, что я в настоящее время не используется, но намереваясь
.
Какой XSLT-компилятор вы используете? – Welbog
Saxon-B 9.1.0.7 – 2009-08-14 15:18:29
Цифры. Я не знаком с этим. Может быть, позже Томалак придет и поможет вам. Работает ли ключ без ключа? – Welbog