首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查查找表中的标签

如何检查查找表中的标签
EN

Stack Overflow用户
提问于 2011-05-10 21:43:43
回答 3查看 232关注 0票数 2

我有这个xml查找表:

代码语言:javascript
复制
<lookup>
<Codes>
<code>123<code>
</Codes>
<Codes>
<code>321<code>
</Codes>
</lookup>

和文档:

代码语言:javascript
复制
<document>
<header>
<remarks>test</remarks>
</header>
<Line>
<Line-Item>
<code>123</code>
</Line-Item>
<Line-Item>
<code>444</code>
</Line-Item>
<Line-Item>
<code>321</code>
</Line-Item>
</Line>
</document>

可以使用查找表代码检查单据代码,如果单据code=lookup代码,则从单据中删除行项目。

答案应该是:

代码语言:javascript
复制
<document>
<header>
<remarks>test</remarks>
</header>
<Line>
<Line-Item>
<code>444</code>
</Line-Item>
</Line>
</document>

我被xsl:stylesheet version="1.0“卡住了。致以最良好的问候:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-11 12:01:53

此转换

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vCodes" select=
 "document('file:///c:/temp/LookupDelete.xml')/*/*/code"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "Line-Item[code
           = document('file:///c:/temp/LookupDelete.xml')
                  /*/*/code
           ]
 "/>

 <xsl:template match=
  "Line[not(Line-Item/code
              [not(. = document('file:///c:/temp/LookupDelete.xml')
                               /*/*/code
                   )
              ]
           )
       ]
  "/>
</xsl:stylesheet>

在所提供的XML文档上应用时的

代码语言:javascript
复制
<document>
    <header>
        <remarks>test</remarks>
    </header>
    <Line>
        <Line-Item>
            <code>123</code>
        </Line-Item>
        <Line-Item>
            <code>444</code>
        </Line-Item>
        <Line-Item>
            <code>321</code>
        </Line-Item>
    </Line>
</document>

生成所需的、正确的结果

代码语言:javascript
复制
<document>
   <header>
      <remarks>test</remarks>
   </header>
   <Line>
      <Line-Item>
         <code>444</code>
      </Line-Item>
   </Line>
</document>

如果文档是此,则为

代码语言:javascript
复制
<document>
    <header>
        <remarks>test</remarks>
    </header>
    <Line>
        <Line-Item>
            <code>123</code>
        </Line-Item>
        <Line-Item>
            <code>321</code>
        </Line-Item>
        <Line-Item>
            <code>321</code>
        </Line-Item>
    </Line>
</document>

,然后正确的结果是(注意,根本没有输出Line元素):

代码语言:javascript
复制
<document>
   <header>
      <remarks>test</remarks>
   </header>
</document>
票数 1
EN

Stack Overflow用户

发布于 2011-05-10 21:54:11

代码语言:javascript
复制
<!-- codes of items to exclude from external document -->
<xsl:variable name="lookup-table" select="document('lookup-table.xml')/lookup/Codes/code"/>

<!-- exclude Line-Items with codes from lookup table -->
<xsl:template match="Line-Item[ code = $lookup-table ]"/>

<!-- 
    exclude <Line> elements, 
    which contains only <Line-Item>'s which will be removed        
-->
<xsl:template match="Line[ not(Line-Item[ code != $lookup-table ]) ]"/>

<!-- copy all other items -->
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl;apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>
票数 1
EN

Stack Overflow用户

发布于 2011-05-10 22:15:59

此样式表产生所需的结果:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:lookup="lookup">
    <lookup:lookup>
        <Codes>
            <code>123</code>
        </Codes>
        <Codes>
            <code>321</code>
        </Codes>
    </lookup:lookup>
    <xsl:variable name="lookup" select="document('')/*/*/Codes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Line">
        <xsl:copy>
            <xsl:apply-templates select="@* |
                 node()[not(self::Line-Item[code=$lookup/code])]"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

请注意,样式表中包含了查找表。如果它太大而不能包含在转换中,那么可以很容易地将其包含在单独的文档中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5951027

复制
相关文章

相似问题

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