Объединение данных из разных узлов и их упорядоченное отображение с использованием xslt - PullRequest
1 голос
/ 12 января 2012

Объединение данных из разных таблиц и их упорядоченное отображение с использованием xslt: у меня есть информация о клиентах и ​​продуктах.1 Клиент может использовать много продуктов.(Отношение 1: n) Симилары 1 Продукт потребляется многими покупателями.(1: n)

Когда я обрабатываю информацию узла потребителя, мне нужно получить информацию о продуктах и ​​отобразить ее в формате tabluar / csv.

Во время обработки информации узла продуктов мне нужнополучить информацию о клиенте и отобразить ее в формате tabluar / csv.

Ввод осуществляется так, как показано ниже.

<?xml version='1.0' encoding='ISO-8859-1' ?>
<info>
<Customers>
    <Customer>
     <CustomerName>01NAME</CustomerName>
     <CustomerAddress>Address1</CustomerAddress>   
     <CustomerUsesProduct>
        <ProductUsed>
            <ProductNumber>PROD01</ProductNumber>
            <ProductNumber>PROD02</ProductNumber>        
        </ProductUsed>
        </CustomerUsesProduct>      
     <CustomerId>CUSTID01</CustomerId>      
    </Customer>

    <Customer>
     <CustomerName>02NAME</CustomerName>
     <CustomerAddress>Address2</CustomerAddress>   
     <CustomerUsesProduct>
        <ProductUsed>
            <ProductNumber>PROD01</ProductNumber>
        </ProductUsed>
        </CustomerUsesProduct>      
     <CustomerId>CUSTID02</CustomerId>      
    </Customer>

    <Customer>
     <CustomerName>03NAME</CustomerName>
     <CustomerAddress>Address3</CustomerAddress>   
     <CustomerUsesProduct>
        <ProductUsed>
            <ProductNumber>PROD03</ProductNumber>
        </ProductUsed>
        </CustomerUsesProduct>      
     <CustomerId>CUSTID03</CustomerId>
    </Customer>

</Customers>

<Products>
    <Product>
        <ProductId>PROD1</ProductId>
        <ProductDescription>ProdDesciption1</ProductDescription>
        <ProductCost>100</ProductCost>
        <CustomerWhoUseThisProduct>
            <CustomerNumber>CUSTID01</CustomerNumber>
        </CustomerWhoUseThisProduct>
    </Product> 

    <Product>
        <ProductId>PROD2</ProductId>
        <ProductDescription>ProdDesciption2</ProductDescription>
        <ProductCost>555</ProductCost>
        <CustomerWhoUseThisProduct>
            <CustomerNumber>CUSTID02</CustomerNumber>
        </CustomerWhoUseThisProduct>
    </Product> 

    <Product>
    <ProductId>PROD3</ProductId>
    <ProductDescription>ProdDesciption3</ProductDescription>
    <ProductCost>777</ProductCost>
    <CustomerWhoUseThisProduct>
        <CustomerNumber>CUSTID03</CustomerNumber>
    </CustomerWhoUseThisProduct>
    </Product>

</Products>
</info>

Цель состоит в выводе в одном текстовом файле. Ожидаемый результат показан ниже..

<CustomerInfo>
CustomerID|CustomerAddress|CustomerName|ProductIDUsed|ProductCost|ProductDescription
CUSTID01|Address1|01Name|PROD01|100|ProdDesciption1
CUSTID01|Address1|01Name|PROD02|555|ProdDesciption2
CUSTID02|Address2|02NAME|PROD01|100|ProdDesciption1
CUSTID03|Address3|03NAME|PROD03|777|ProdDesciption3

<ProductInformation>
ProductID|ProductCost|ProductDescription|CustomerID|CustomerAddress|CustomerName
PROD1|100|ProdDesciption1|CUSTID01|Address1|01NAME
PROD2|555|ProdDesciption2|CUSTID02|Address2|02NAME
PROD3|777|ProdDesciption3|CUSTID03|Address3|03NAME

Если вы считаете, что выходные данные упорядочены (т.е. столбцы упорядочены) в соответствии с ожиданиями.Похоже, я соединяю две таблицы с помощью ключа, и это именно то, что я пытаюсь сделать.

При обработке клиентов.

Клиенты / Клиент / CustomerUsesProduct / ProductUsed / ProductNumber = Products / Product /ProductId

при обработке продуктов.

Products / Product / CustomerWhoUseThisProduct / CustomerNumber = Customers / Customer / CustomerId

Поскольку каждый узел ссылается на другой, как убедиться, что он не будетбыть круговой ссылкой на себя, в результате чего приложение может зависнуть.

Заранее спасибо.

1 Ответ

0 голосов
/ 13 января 2012

Редактировать: добавлены шаблоны для ProductInformation

Мне пришлось изменить /info/Products/Product/ProductId в вашем примере XML-файла, чтобы они соответствовали /info/Customers/Customer/CustomerUsesProduct/ProductUsed/ProductNumber.

Обновлен ввод XML:

<info>
  <Customers>
    <Customer>
      <CustomerName>01NAME</CustomerName>
      <CustomerAddress>Address1</CustomerAddress>   
      <CustomerUsesProduct>
        <ProductUsed>
          <ProductNumber>PROD01</ProductNumber>
          <ProductNumber>PROD02</ProductNumber>        
        </ProductUsed>
      </CustomerUsesProduct>      
      <CustomerId>CUSTID01</CustomerId>      
    </Customer>

    <Customer>
      <CustomerName>02NAME</CustomerName>
      <CustomerAddress>Address2</CustomerAddress>   
      <CustomerUsesProduct>
        <ProductUsed>
          <ProductNumber>PROD01</ProductNumber>
        </ProductUsed>
      </CustomerUsesProduct>      
      <CustomerId>CUSTID02</CustomerId>      
    </Customer>

    <Customer>
      <CustomerName>03NAME</CustomerName>
      <CustomerAddress>Address3</CustomerAddress>   
      <CustomerUsesProduct>
        <ProductUsed>
          <ProductNumber>PROD03</ProductNumber>
        </ProductUsed>
      </CustomerUsesProduct>      
      <CustomerId>CUSTID03</CustomerId>
    </Customer>

  </Customers>

  <Products>
    <Product>
      <ProductId>PROD01</ProductId>
      <ProductDescription>ProdDesciption1</ProductDescription>
      <ProductCost>100</ProductCost>
      <CustomerWhoUseThisProduct>
        <CustomerNumber>CUSTID01</CustomerNumber>
      </CustomerWhoUseThisProduct>
    </Product> 

    <Product>
      <ProductId>PROD02</ProductId>
      <ProductDescription>ProdDesciption2</ProductDescription>
      <ProductCost>555</ProductCost>
      <CustomerWhoUseThisProduct>
        <CustomerNumber>CUSTID02</CustomerNumber>
      </CustomerWhoUseThisProduct>
    </Product> 

    <Product>
      <ProductId>PROD03</ProductId>
      <ProductDescription>ProdDesciption3</ProductDescription>
      <ProductCost>777</ProductCost>
      <CustomerWhoUseThisProduct>
        <CustomerNumber>CUSTID03</CustomerNumber>
      </CustomerWhoUseThisProduct>
    </Product>

  </Products>
</info>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:apply-templates select="node()|@*"/>
  </xsl:template>

  <xsl:template match="Customers">
    <xsl:text>&#xA;&lt;CustomerInfo&gt;&#xA;</xsl:text>
    <xsl:text>CustomerID|CustomerAddress|CustomerName|ProductIDUsed|ProductCost|ProductDescription&#xA;</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="Customer">
    <xsl:variable name="vId" select="CustomerId"/>
    <xsl:variable name="vName" select="CustomerName"/>
    <xsl:variable name="vAddress" select="CustomerAddress"/>
    <xsl:for-each select="CustomerUsesProduct/ProductUsed/ProductNumber">
      <xsl:variable name="vCost" select="/info/Products/Product[ProductId=current()]/ProductCost"/>
      <xsl:variable name="vDesc" select="/info/Products/Product[ProductId=current()]/ProductDescription"/>
      <xsl:value-of select="concat($vId,'|',$vAddress,'|',$vName,'|',.,'|',$vCost,'|',$vDesc,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="Products">
    <xsl:text>&#xA;&lt;ProductInformation&gt;&#xA;</xsl:text>
    <xsl:text>ProductID|ProductCost|ProductDescription|CustomerID|CustomerAddress|CustomerName&#xA;</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="Product">
    <xsl:variable name="vId" select="ProductId"/>
    <xsl:variable name="vCost" select="ProductCost"/>
    <xsl:variable name="vDesc" select="ProductDescription"/>
    <xsl:for-each select="CustomerWhoUseThisProduct/CustomerNumber">
      <xsl:variable name="vName" select="/info/Customers/Customer[CustomerId=current()]/CustomerName"/>
      <xsl:variable name="vAddress" select="/info/Customers/Customer[CustomerId=current()]/CustomerAddress"/>      
      <xsl:value-of select="concat($vId,'|',$vCost,'|',$vDesc,'|',.,'|',$vAddress,'|',$vName,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Вывод текста:

<CustomerInfo>
CustomerID|CustomerAddress|CustomerName|ProductIDUsed|ProductCost|ProductDescription
CUSTID01|Address1|01NAME|PROD01|100|ProdDesciption1
CUSTID01|Address1|01NAME|PROD02|555|ProdDesciption2
CUSTID02|Address2|02NAME|PROD01|100|ProdDesciption1
CUSTID03|Address3|03NAME|PROD03|777|ProdDesciption3

<ProductInformation>
ProductID|ProductCost|ProductDescription|CustomerID|CustomerAddress|CustomerName
PROD01|100|ProdDesciption1|CUSTID01|Address1|01NAME
PROD02|555|ProdDesciption2|CUSTID02|Address2|02NAME
PROD03|777|ProdDesciption3|CUSTID03|Address3|03NAME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...