首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与同级项匹配的xsl获取节点项

与同级项匹配的xsl获取节点项
EN

Stack Overflow用户
提问于 2018-03-21 06:01:05
回答 2查看 34关注 0票数 0

我得到了以下XML:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<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选择示例时

代码语言:javascript
复制
//document/naam[../code='thr6UhEw5bER6Cjt8uSCCg']/text()

它工作得很好,但是一旦我用current()/document./document替换它,它就会恢复任何东西.

当我使用静态xpath时,它可以很好地工作,并为每个foreach循环检索信息。

如何在de中动态地创建xpath?

目前我正试图找出xslt,尽管我不能真正地让它正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 09:00:43

当前表达式的问题是,您用撇号将./document括起来,这使它成为字符串文本,而不是表达式。

应该是这样的(而且您也需要使用current().表示上下文节点,current()表示当前节点。见Current node vs. Context node in XSLT/XPath?)

代码语言:javascript
复制
<xsl:value-of select="//document/naam[../code=current()/document]/text()"/>

或者,稍微简单一点,这个..。

代码语言:javascript
复制
<xsl:value-of select="//document[code=current()/document]/naam"/>

更好的是,使用一个键来查找文档。

代码语言:javascript
复制
<xsl:key name="docs" match="document[code]" use="code" />

然后这个表情变成了..。

代码语言:javascript
复制
<xsl:value-of select="key('docs', document)/naam"/>

试试这个XSLT

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2018-03-21 08:31:02

<xsl:for-each select="subdocuments/subdocument">中,需要将document的值存储在变量中。

代码语言:javascript
复制
<xsl:variable name="doc" select="document" />

使用此变量的值与code的值进行比较,并提取所需的值。

代码语言:javascript
复制
<xsl:value-of select="//document[code=$doc]/naam" />

提取值的另一个选项是使用ancestor轴。

代码语言:javascript
复制
<xsl:value-of select="ancestor::documentset/documenten/document[code=$doc]/naam" />

下面是更新的模板

代码语言:javascript
复制
<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>

这提供了以下输出

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49399238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档