Как добавить xml-файлы 'join' с помощью xslt? - PullRequest
1 голос
/ 05 ноября 2010

Я нашел несколько похожих ответов, но не могу понять, почему это не работает; Это урезанная версия моей настоящей проблемы, но я проверил ее и получил тот же результат;

test1.xml

<?xml version="1.0" encoding="UTF8"?>
<fieldList>
<sourceField name="SourceTime">
<fid>REC_TIME</fid>
</sourceField>
</fieldList>

lookup.xml

<?xml version="1.0" encoding="UTF-8"?>
<data>
<field  name="REC_TIME" fid_type="DATE"/>
</data>

joinTest.xsml

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" media-type="text/plain"/>
<xsl:variable name="fieldDict" select="'lookup.xml'" />
<xsl:template match="/fieldList/*[fid]">
<xsl:variable name="id" select="current()"/>
<xsl:value-of select="$id"/>
<xsl:for-each select="document($fieldDict)/data/field[@name = $id]">
<xsl:value-of select="@type"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Теперь, если я изменю xpath на [@name], я получу

REC_TIME
MONKEY

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

Я тестирую это с xsltproc в Linux

xsltproc --version
Using libxml 20705, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20632, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20632
libexslt 813 was compiled against libxml 20632

Большое спасибо.

1 Ответ

2 голосов
/ 05 ноября 2010

Это преобразование является самой простой коррекцией вашего XSLT-кода, которая дает желаемый результат :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my"
>
    <xsl:output method="xml" encoding="UTF-8" media-type="text/plain"/>

    <my:lookup>
        <data>
          <field  name="REC_TIME" fid_type="DATE"/>
        </data>
    </my:lookup>

    <xsl:variable name="fieldDict" select="document('')/*/my:lookup" />

    <xsl:template match="/fieldList/*[fid]">
        <xsl:variable name="id" select="fid"/>
        <xsl:value-of select="$id"/>
        <xsl:text> </xsl:text>
        <xsl:for-each select="$fieldDict/data/field[@name = $id]">
            <xsl:value-of select="@fid_type"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

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

<fieldList>
    <sourceField name="SourceTime">
        <fid>REC_TIME</fid>
    </sourceField>
</fieldList>

желаемый результат получен :

REC_TIME DATE

Примечание :

  1. Единственным значительным изменением в вашем коде стало определение $id.

  2. Обычно для таких операций рекомендуется использовать ключи для ускорения обработки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...