2016-01-12 2 views
-1

В настоящее время я пытаюсь создать документ xsl, который использует значение из текущего xml, а также документ с внешней ссылкой, используя select = 'document()'.XSL: Как избежать области документа()?

Мой код:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="root"> 
    <results> 
     <xsl:apply-templates select=".//TestLog"/> 
    </results> 
    </xsl:template> 

    <xsl:template match="TestLog"> 
    <xsl:variable name="id" select='data/testcase/id'/> 
    <testcase> 
     <xsl:attribute name="internalid"> 
     <xsl:value-of select="document('internal_ids.xml', /)//testcase[custom_fields/custom_field/value=$id]/@internalid"/> 
     </xsl:attribute> 
     <desc><xsl:value-of select="data/testcase/description"/></desc> 
     <more_data><xsl:value-of select="data/testcase/more_data"/></more_data> 
    </testcase> 
    </xsl:template> 

Проблема заключается в том, что я хочу, чтобы получить внутренний идентификатор TestCase в internal_ids.xml, который имеет тот же PID, как TestLog. Я не могу использовать «переменную», потому что она не изменяется динамически для каждого обработанного тестового журнала, но мне нужно каким-то образом ссылаться на идентификатор текущего обработчика TestLog, находясь внутри области document(). Использование «xsl: variable» устанавливает ВСЕ внутреннее значение testcase в одно и то же значение, поскольку переменная не изменяется. Вместо использования переменной я могу каким-то образом ссылаться на узел TestLog в области document(), чтобы я мог проверить значение = 'data/testcase/id' без этой ссылки на документ/testcase/id документа document() документа XPATH?

internal_ids.xml:

<testsuite> 
    <testcase internalid="123" name="stuff"> 
    <custom_fields> 
     <custom_field> 
     <name>pid</name> 
     <value>TC-878</value> 
     </custom_field> 
    </custom_fields> 
    </testcase> 
    <testcase internalid="456" name="stuff2"> 
    <custom_fields> 
     <custom_field> 
     <name>pid</name> 
     <value>TC-200</value> 
     </custom_field> 
    </custom_fields> 
    </testcase> 
</testsuite> 

original.xml:

<root> 
    <TestLog> 
    <data> 
     <testcase> 
     <id>TC-878</id> 
     <description>Foo bar foo bar</description> 
     <more_data>More data is here</more_data> 
     </testcase> 
    </data> 
    </TestLog> 
    <TestLog> 
    <data> 
     <testcase> 
     <id>TC-200</id> 
     <description>Blah blah</description> 
     <more_data> baz </more_data> 
     </testcase> 
    </data> 
    </TestLog> 
</root> 

И мой желаемый output.xml:

<results> 
    <testcase internalid="123"> 
    <desc>Foo bar foo bar</desc> 
    <more_data>More data is here</more_data> 
    </testcase> 
    <testcase internalid="456"> 
    <desc>Blah Blah</desc> 
    <more_data> baz </more_data> 
    </testcase> 
</results> 
+0

Можете ли вы показать нам образец ввода и выходные данные, которые вы хотите создать? Что касается доступа к элементу 'TestLog', почему вы не можете использовать переменную для ее хранения? –

+0

Обновлено с входами и выходами! – Mindputty

+0

Теперь, когда вы отправили образцы, я не понимаю, почему ваш опубликованный XSLT с переменной внутри шаблона для 'TestLog' не работает. Можете ли вы объяснить, каким образом он не дает вам результат, который вы хотите. –

ответ

0

Следующая таблица стилей:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="root"> 
    <results> 
     <xsl:apply-templates/> 
    </results> 
</xsl:template> 

<xsl:template match="TestLog"> 
    <xsl:variable name="id" select='data/testcase/id'/> 
    <testcase> 
     <xsl:attribute name="internalid"> 
     <xsl:value-of select="document('internal_ids.xml')/testsuite/testcase[custom_fields/custom_field/value=$id]/@internalid"/> 
     </xsl:attribute> 
     <desc><xsl:value-of select="data/testcase/description"/></desc> 
     <more_data><xsl:value-of select="data/testcase/more_data"/></more_data> 
    </testcase> 
</xsl:template> 

</xsl:stylesheet> 

применяется для следующих входных документов:

XML

<root> 
    <TestLog> 
    <data> 
     <testcase> 
     <id>TC-878</id> 
     <description>Foo bar foo bar</description> 
     <more_data>More data is here</more_data> 
     </testcase> 
    </data> 
    </TestLog> 
    <TestLog> 
    <data> 
     <testcase> 
     <id>TC-200</id> 
     <description>Blah blah</description> 
     <more_data> baz </more_data> 
     </testcase> 
    </data> 
    </TestLog> 
</root> 

internal_ids.xml

<testsuite> 
    <testcase internalid="123" name="stuff"> 
    <custom_fields> 
     <custom_field> 
     <name>a testcase</name> 
     <value>TC-878</value> 
     </custom_field> 
    </custom_fields> 
    </testcase> 
    <testcase internalid="456" name="stuff2"> 
    <custom_fields> 
     <custom_field> 
     <name>Another testcase</name> 
     <value>TC-200</value> 
     </custom_field> 
    </custom_fields> 
    </testcase> 
</testsuite> 

возвращается:

Результат

<?xml version="1.0" encoding="UTF-8"?> 
<results> 
    <testcase internalid="123"> 
     <desc>Foo bar foo bar</desc> 
     <more_data>More data is here</more_data> 
    </testcase> 
    <testcase internalid="456"> 
     <desc>Blah blah</desc> 
     <more_data> baz </more_data> 
    </testcase> 
</results> 

Было бы предпочтительнее использовать ключ, чтобы получить значение из другого документа - особ. если вы используете XSLT 2.0, где ключи работают через документы.

+0

Спасибо за ваш ответ. Это не работает для меня, но я не давал точных данных, с которыми я работаю на своей машине, и это как-то влияет на результат. Мне нужно вернуться и проверить все ... возможно, я буду перекомпостировать весь свой код, как только я это сделаю ... :( – Mindputty

+0

Результат, который я получаю, имеет Mindputty

+0

@Mindputty Мы можем работать только с тем, что вы нам даете. Результат, полученный выше, был получен с использованием трех документов, вставленных (!) в мой пост и проверенных с использованием трех разных процессоров XSLT 1.0. - Обратите внимание, что у меня было все три документа в том же каталоге. –

Смежные вопросы