XSLT-условия, совпадающие со списком, хранящимся во внешнем файле - PullRequest
2 голосов
/ 21 декабря 2011

Я пытаюсь написать XSLT, который извлекает элементы, соответствующие условиям, перечисленным в другом файле.

ВХОДНОЙ ФАЙЛ (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 ]

2 голосов
/ 21 декабря 2011

Это простое (без условий, без 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 голос
/ 21 декабря 2011

Может быть, это работает лучше?

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...