XSLT条件与存储在外部文件中的列表匹配

时间:2011-12-21 15:23:46

标签: list xslt variables

我正在尝试编写一个XSLT,它提取的项目与另一个文件中列出的条件相匹配。

INPUT FILE(input.xml)

<ItemList>
   <Item>
      <Product>ABC</Product>
      <Price>10.00</Price>
   </Item>
   <Item>
      <Product>DEF</Product>
      <Price>20.00</Price>
   </Item>
   <Item>
      <Product>GHI</Product>
      <Price>30.00</Price>
   </Item>
   <Item>
      <Product>JKL</Product>
      <Price>40.00</Price>
   </Item>
</ItemList>

外部列表文件(Codes.xml)

<ProductCodeList>
   <ProductCode>ABC</ProductCode>
   <ProductCode>JKL</ProductCode>
</ProductCodeList>

预期输出(output.xml)

<ItemList>
   <Item>
      <Product>ABC</Product>
      <Price>10.00</Price>
   </Item>
   <Item>
      <Product>JKL</Product>
      <Price>40.00</Price>
   </Item>
</ItemList>

你能告诉我哪一个不起作用吗?

<xsl:variable name="productCodeList" select="document('Codes.xml')/ProductCodeList/ProductCode" />`

<xsl:template match="/">
  <xsl:apply-templates select="/ItemList/Item[Product=$productCodeList]"/>
</xsl:template>

<xsl:template match="/ItemList/Item">
  <xsl:copy-of select="."/>
</xsl:template>

2 个答案:

答案 0 :(得分:2)

这个简单(没有条件,没有current())转型

<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="vProds" select=
  "document('file:///c:/temp/delete/ProductList.xml')"/>

 <xsl:template match="/">
   <ItemList>
         <xsl:copy-of select=
         "/*/Item
             [Product
             =
              $vProds/*/ProductCode
           ]
         "/>
    </ItemList>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<ItemList>
    <Item>
        <Product>ABC</Product>
        <Price>10.00</Price>
    </Item>
    <Item>
        <Product>DEF</Product>
        <Price>20.00</Price>
    </Item>
    <Item>
        <Product>GHI</Product>
        <Price>30.00</Price>
    </Item>
    <Item>
        <Product>JKL</Product>
        <Price>40.00</Price>
    </Item>
</ItemList>

并将提供的Productlist.xml存储在 c:\temp\delete

<ProductCodeList>
    <ProductCode>ABC</ProductCode>
    <ProductCode>JKL</ProductCode>
</ProductCodeList>

生成想要的正确结果

<ItemList>
   <Item>
      <Product>ABC</Product>
      <Price>10.00</Price>
   </Item>
   <Item>
      <Product>JKL</Product>
      <Price>40.00</Price>
   </Item>
</ItemList>

答案 1 :(得分:1)

这可能会更好吗?

<xsl:variable name="productCodeList" select="document('Codes.xml')/ProductCodeList/ProductCode" />
<xsl:template match="/">
    <xsl:apply-templates select="/ItemList/Item"/>
</xsl:template>
<xsl:template match="/ItemList/Item">
    <xsl:if test="$productCodeList[.=current()/Product]">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>