在XSLT中基于ID组合多个xml节点值

时间:2014-09-26 15:57:29

标签: xml xslt

我是XSLT的新手并且在项目中得到了如下所述的要求。我有一个XML文件,如下所示。



<Results>
  - <Result>
    <Usuals>
      <Products>
        <Product>
        <ProductId>1</ProductId>
        <ProductName>Test1</ProductName>
        <ProductLocation>TestPlace1</ProductLocation>
        </Product>
        <Product>
          <ProductId>2</ProductId>
          <ProductName>Test2</ProductName>
          <ProductLocation>TestPlace2</ProductLocation>
        </Product>
        <Product>
          <ProductId>3</ProductId>
          <ProductName>Test3</ProductName>
          <ProductLocation>TestPlace3</ProductLocation>
        </Product>
      </Products>      
    </Usuals>
    </Result>

    - <Result>
      <Price>
        <Products>
          <Product>
            <ProductId>1</ProductId>
            <PriceValue>100</PriceValue>         
          </Product>
          <Product>
            <ProductId>2</ProductId>
            <PriceValue>200</PriceValue>
          </Product>
          <Product>
            <ProductId>3</ProductId>
            <PriceValue>300</PriceValue>
          </Product>
        </Products>
      </Price>
    </Result>
    
  <Result>
    <Items>
      <Products>
        <Product>
          <ProductId>1</ProductId>
          <ItemValue>400</ItemValue>
        </Product>
        <Product>
          <ProductId>2</ProductId>
          <ItemValue>500</ItemValue>
        </Product>
        <Product>
          <ProductId>3</ProductId>
          <ItemValue>600</ItemValue>
        </Product>
      </Products>
    </Items>
  </Result>
  </Results>
&#13;
&#13;
&#13; 我的目标是使用XSLT生成以下伪代码输出。我已经尝试过,但无法找到实现这一目标的方法。这可以实现吗?

foreach(Product product in Usuals.Products)
{
//display product.ProductId,
//display PriceValue for matching product.ProductId in Price.Products
//display ItemValue for matching product.ProductId in Items.Products
}

提前致谢,

1 个答案:

答案 0 :(得分:0)

实现此目标的最简单方法是定义。您只需使用一个涵盖所有Product元素的键

即可
<xsl:key name="productsById" match="Product" use="ProductId" />

现在给定ID x,您可以使用XPath表达式获取包含具有该ID的所有Product元素的节点集

key('productsById', x)

这将为您提供一组三个元素节点,ProductUsualsPrice下的匹配Items元素,因此价格可以作为< / p>

key('productsById', x)/PriceValue

ItemValue

key('productsById', x)/ItemValue

Product函数返回的三个key元素中只有一个具有这些子元素并不重要,路径表达式将正常工作。“