2014-09-26 3 views
0

Я новичок в XSLT и получил требование в проекте, как указано ниже. У меня есть XML-файл, как показано ниже. Объединение нескольких значений узлов xml на основе ID в XSLT

<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>
Моя цель - создать следующий вывод псевдокода с использованием 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 
} 

Спасибо заранее,

+0

Да, это может быть достигнуто. –

+0

Этот вопрос не соответствует теме, потому что речь идет о запросе кода. –

+0

«Я пытался с моей стороны» - что именно вы пробовали до сих пор? –

ответ

0

Самый простой способ для достижения этой цели было бы определить ключ. Вы можете сделать с помощью только одного ключа, охватывающего всех Product элементов

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

Теперь данный идентификатор x вы можете получить набор узлов, содержащий все Product элементов с этим идентификатором, используя выражение XPath

key('productsById', x) 

Это даст вам набор из трех элементов, соответствующих Product элементам от Usuals, Price и Items, поэтому цена будет доступна как

key('productsById', x)/PriceValue 

ItemValue и в

key('productsById', x)/ItemValue 

(тот факт, что только один из трех Product элементов, возвращаемых функцией key имеет каждый из этих детей не имеет значения, выражение пути будет работать корректно).

+0

Большое вам спасибо за быстрый ответ Яна. Это то, что я искал. Ян, у меня есть быстрый вопрос. В настоящее время в вышеупомянутом ключе xsl значение атрибута «use» - это «ProductId», который является постоянной строкой во всех узлах. Если разные узлы имеют разные обозначения для «ProductId», т. Е. Если в вышеприведенном случае узлы «Продукты» под узлом «Price» содержат «ProdId» вместо узлов «ProductId» и «Products» в узле «Items», вместо этого «PID» из «ProductId», я не могу использовать этот подход правильно? Любые предложения по этому поводу? – user3796454

+0

@ user3796454 В этом случае самым простым подходом было бы использование отдельных ключей для разных разделов - ' 'и т. Д. –

Смежные вопросы