2011-05-10 77 views
2

我有,这个XML查找表:如何检查标签查找表

<lookup> 
<Codes> 
<code>123<code> 
</Codes> 
<Codes> 
<code>321<code> 
</Codes> 
</lookup> 

和文件:

<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> 

有可能,检查与查找表的代码文件的代码,如果文档代码=查找代码,从文档中删除行项目。

的答案应该是:

<document> 
<header> 
<remarks>test</remarks> 
</header> 
<Line> 
<Line-Item> 
<code>444</code> 
</Line-Item> 
</Line> 
</document> 

我卡上的xsl:样式版本= “1.0”。 最好的问候:)

+0

问得好,+1。查看我的答案,获得一个完整的XSLT 1.0解决方案,即使在这种边缘情况下,当查找表中包含所有“行项目/代码”值时,该解决方案仍能正常工作。 – 2011-05-11 04:09:26

回答

1

这种转变

<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文档应用:

<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> 

产生想要的,正确的结果

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
    <Line> 
     <Line-Item> 
     <code>444</code> 
     </Line-Item> 
    </Line> 
</document> 

如果该文件是这样的

<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元件输出的话):

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
</document> 
+0

谢谢你的回答,我正在寻找和你写的一样的东西。 – Petras 2011-05-11 05:58:46

+0

@Petras:不客气。 – 2011-05-11 12:48:11

1
<!-- 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> 
+0

不幸的是,这个解决方案在XSLT 1.0中不起作用。试用XSLT 1.0处理器。 – 2011-05-11 04:07:18

+0

感谢tryng,但我注意到,在XSLT 1.0中工作。 – Petras 2011-05-11 05:56:04

1

这个样式表产生期望的结果:

<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

@lwburk:我不认为这个答案是正确的,因为当所有'Line-Item/code'元素值都在查找表中时,它仍然会产生一个'Line'元素。 – 2011-05-11 04:05:03

+0

@lwburk:谢谢你的回答。我会尝试。 – Petras 2011-05-11 05:57:32

+0

@Dimitre - 足够公平,但我试图想象一个空'Line'元素可能很重要的场景。思考? – 2011-05-11 14:53:16