我得到了以下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中动态地创建xpath?
目前我正试图找出xslt,尽管我不能真正地让它正常工作。
发布于 2018-03-21 09:00:43
当前表达式的问题是,您用撇号将./document括起来,这使它成为字符串文本,而不是表达式。
应该是这样的(而且您也需要使用current()。.表示上下文节点,current()表示当前节点。见Current node vs. Context node in 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>发布于 2018-03-21 08:31:02
在<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>https://stackoverflow.com/questions/49399238
复制相似问题