我得到了以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<batch>
<batchnummer>782</batchnummer>
<continueonerror>true</continueonerror>
<metafileversion>1.0</metafileversion>
<documentset>
<naam></naam>
<type></type>
<subsets>
<subset>
<staple>true</staple>
<subdocuments>
<subdocument>
<document>thr6UhEw5bER6Cjt8uKOCg</document>
<stamp></stamp>
<mediatype>Briefpapier</mediatype>
<duplex>false</duplex>
</subdocument>
<subdocument>
<document>thr6UhEw5bER6Cjt8uRUiA</document>
<stamp></stamp>
<mediatype>Briefpapier</mediatype>
<duplex>false</duplex>
</subdocument>
</subdocuments>
</subset>
<subset>
<staple>true</staple>
<subdocuments>
<subdocument>
<document>thr6UhEw5bER6Cjt8uSxgA</document>
<stamp></stamp>
<mediatype>Blanco</mediatype>
<duplex>false</duplex>
</subdocument>
<subdocument>
<document>thr6UhEw5bER6Cjt8uSCCg</document>
<stamp></stamp>
<mediatype>Blanco</mediatype>
<duplex>false</duplex>
</subdocument>
<subdocument>
<document>thr6UhEw5bER6Cjt8uKOCg</document>
<stamp></stamp>
<mediatype>Briefpapier</mediatype>
<duplex>false</duplex>
</subdocument>
<subdocument>
<document>thr6UhEw5bER6Cjt8uUH-A</document>
<stamp></stamp>
<mediatype>Briefpapier</mediatype>
<duplex>false</duplex>
</subdocument>
</subdocuments>
</subset>
</subsets>
<documenten>
<document>
<naam>00000782_000001.rtf</naam>
<code>thr6UhEw5bER6Cjt8uKOCg</code>
<duplex>false</duplex>
<type>RTF</type>
</document>
<document>
<naam>00000782_000002.rtf</naam>
<code>thr6UhEw5bER6Cjt8uRUiA</code>
<duplex>false</duplex>
<type>RTF</type>
</document>
<document>
<naam>00000782_000003.rtf</naam>
<code>thr6UhEw5bER6Cjt8uSCCg</code>
<duplex>false</duplex>
<type>RTF</type>
</document>
<document>
<naam>00000782_000004.rtf</naam>
<code>thr6UhEw5bER6Cjt8uSxgA</code>
<duplex>false</duplex>
<type>RTF</type>
</document>
<document>
<naam>00000782_000005.rtf</naam>
<code>thr6UhEw5bER6Cjt8uUH-A</code>
<duplex>false</duplex>
<type>RTF</type>
</document>
</documenten>
</documentset>
<batchcontrole>
<cntset>29</cntset>
<cntdoc>75</cntdoc>
<cntsub>58</cntsub>
</batchcontrole>
</batch>
和以下 XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="//subsets/subset">
<subset>
<xsl:for-each select="subdocuments/subdocument">
<documentname><xsl:value-of select="./document"/></documentname>
<documentcode><xsl:value-of select="//document/naam[../code='./document']/text()"/></documentcode>
</xsl:for-each>
</subset>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
不知何故,我无法动态选择"naam"节点。 当我执行特定的 xpath 选择示例时
//document/naam[../code='thr6UhEw5bER6Cjt8uSCCg']/text()
它工作正常,但一旦我用current()/document
或./document
替换它,它就不再检索任何东西了......
当我使用静态 xpath 时,它工作正常并检索每个 foreach 循环的信息。
如何在 de xslt 中动态地制作 xpath?
目前正在尝试弄清楚 xslt,尽管我无法真正让它正常工作......
当前表达式的问题在于您将./document
括在撇号中,这使它成为字符串文字,而不是表达式。
应该是这个(你也需要使用current()
。 .
表示上下文节点,current()
当前节点。请参阅 XSLT/XPath 中的当前节点与上下文节点?
<xsl:value-of select="//document/naam[../code=current()/document]/text()"/>
或者,稍微简单一点,这个...
<xsl:value-of select="//document[code=current()/document]/naam"/>
更好的是,使用密钥查找文档。
<xsl:key name="docs" match="document[code]" use="code" />
然后表达式变成这样。
<xsl:value-of select="key('docs', document)/naam"/>
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="docs" match="document[code]" use="code" />
<xsl:template match="/">
<xsl:for-each select="//subsets/subset">
<subset>
<xsl:for-each select="subdocuments/subdocument">
<documentname><xsl:value-of select="document"/></documentname>
<documentcode><xsl:value-of select="key('docs', document)/naam"/></documentcode>
</xsl:for-each>
</subset>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在<xsl:for-each select="subdocuments/subdocument">
内部,需要将document
的值存储在一个变量中
<xsl:variable name="doc" select="document" />
使用此变量的值与 code
的值进行比较并提取所需的值。
<xsl:value-of select="//document[code=$doc]/naam" />
提取值的另一个选项是使用ancestor
轴。
<xsl:value-of select="ancestor::documentset/documenten/document[code=$doc]/naam" />
以下是更新的模板
<xsl:template match="/">
<xsl:for-each select="//subsets/subset">
<subset>
<xsl:for-each select="subdocuments/subdocument">
<xsl:variable name="doc" select="document" />
<documentname>
<xsl:value-of select="$doc" />
</documentname>
<documentcode>
<xsl:value-of select="//document[code=$doc]/naam" />
</documentcode>
</xsl:for-each>
</subset>
</xsl:for-each>
</xsl:template>
这将给出以下输出
<subset>
<documentname>thr6UhEw5bER6Cjt8uKOCg</documentname>
<documentcode>00000782_000001.rtf</documentcode>
<documentname>thr6UhEw5bER6Cjt8uRUiA</documentname>
<documentcode>00000782_000002.rtf</documentcode>
</subset>
<subset>
<documentname>thr6UhEw5bER6Cjt8uSxgA</documentname>
<documentcode>00000782_000004.rtf</documentcode>
<documentname>thr6UhEw5bER6Cjt8uSCCg</documentname>
<documentcode>00000782_000003.rtf</documentcode>
<documentname>thr6UhEw5bER6Cjt8uKOCg</documentname>
<documentcode>00000782_000001.rtf</documentcode>
<documentname>thr6UhEw5bER6Cjt8uUH-A</documentname>
<documentcode>00000782_000005.rtf</documentcode>
</subset>