XSL 抓取节点项匹配同级项

  • 本文关键字:节点 XSL 抓取 xml xslt
  • 更新时间 :
  • 英文 :


我得到了以下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>

最新更新