我目前正在尝试使用select ='document()'创建一个xsl文档,该文档使用当前xml中的值以及外部引用的文档。
我的代码:
<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>
问题是我想在internal_ids.xml中获取testcase的内部id,该id与testLog具有相同的pid。我不能使用'variable',因为它不会为每个处理过的TestLog动态改变,但我需要一些方法来引用当前正在处理的TestLog的id,同时在document()的范围内。使用'xsl:variable'将ALL testcase的内部ID设置为相同的值,因为变量不会更改。我可以以某种方式引用document()范围内的TestLog节点,而不是使用变量,这样我可以测试value ='data / testcase / id'而不用XPATH引用document()的data / testcase / id吗?
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 :(得分: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,其中密钥可以跨文档工作。