XSLT - показывать атрибуты на том же уровне, что и элементы - PullRequest
0 голосов
/ 24 марта 2020

Вот пример файла XML. Это простой заказ на покупку.

<ShipNotice  PONumber="123456" DropShip="false" Branch="ACME" ShipNoticeId="987654321">
    <Items>
        <Item>
            <Quantity>1</Quantity>
            <UnitPrice>715</UnitPrice>
            <SellerPartNumber>24ABB336ABN3</SellerPartNumber>
            <Serialized>false</Serialized>
        </Item>
    </Items>
</ShipNotice>

Вот моя текущая версия файла XSLT.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Item">
    <html>
      <body>
        <xsl:for-each select="Item">
          <xsl:value-of select="/ShipNotice/@PONumber" />
          <xsl:value-of select="/ShipNotice/@DropShip" />
          <xsl:value-of select="/ShipNotice/@Branch" />
          <xsl:value-of select="/ShipNotice/@ShipNoticeId" />
          <xsl:value-of select="Quantity" />
          <xsl:value-of select="UnitPrice" />
          <xsl:value-of select="SellerPartNumber" />
          <xsl:value-of select="ItemDescription" />
          <xsl:value-of select="Serialized" />
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Я хочу вывести 4 глобальных атрибута для каждого элемента. Что мне не хватает? Конечная цель состоит в том, что эти данные будут go в SQL таблицу, поэтому я стремлюсь к чему-то вроде этого:

<ShipNotice  PONumber="123456" DropShip="false" Branch="ACME" ShipNoticeId="987654321">
    <Items>
        <Item>
            <PONumber>123456</PONumber>
            <DropShip>false</DropShip>
            <Branch>ACME</Branch>
            <ShipNoticeId>987654321</ShipNoticeId>
            <Quantity>1</Quantity>
            <UnitPrice>715</UnitPrice>
            <SellerPartNumber>24ABB336ABN3</SellerPartNumber>
            <Serialized>false</Serialized>
        </Item>
    </Items>
</ShipNotice>

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

"... Конечная цель - эти данные будут go в SQL таблицу ..."

Вы не указали поставщика базы данных, но если конечный пункт назначения - MS SQL Таблица сервера, вы можете загрузить XML напрямую, без преобразования XSLT. Проверьте это.

SQL

DECLARE @xml XML = 
N'<ShipNotice  PONumber="123456" DropShip="false" Branch="ACME" ShipNoticeId="987654321">
    <Items>
        <Item>
            <Quantity>1</Quantity>
            <UnitPrice>715</UnitPrice>
            <SellerPartNumber>24ABB336ABN3</SellerPartNumber>
            <Serialized>false</Serialized>
        </Item>
    </Items>
</ShipNotice>';

-- uncomment line below when you are ready
--INSERT INTO tbl (PONumber, ...)
SELECT c.value('@PONumber','INT') AS PONumber
    , c.value('@DropShip','VARCHAR(5)') AS DropShip
    , c.value('@Branch','VARCHAR(50)') AS Branch
    , c.value('@ShipNoticeId','VARCHAR(50)') AS ShipNoticeId
    , i.value('(Quantity/text())[1]','INT') AS Quantity
    , i.value('(UnitPrice/text())[1]','DECIMAL(10,2)') AS UnitPrice
    , i.value('(SellerPartNumber/text())[1]','VARCHAR(20)') AS SellerPartNumber
    , i.value('(Serialized/text())[1]','VARCHAR(5)') AS Serialized
FROM @xml.nodes('/ShipNotice') AS t(c)
    CROSS APPLY t.c.nodes('Items/Item') AS item(i);

Выход

+----------+----------+--------+--------------+----------+-----------+------------------+------------+
| PONumber | DropShip | Branch | ShipNoticeId | Quantity | UnitPrice | SellerPartNumber | Serialized |
+----------+----------+--------+--------------+----------+-----------+------------------+------------+
|   123456 | false    | ACME   |    987654321 |        1 |    715.00 | 24ABB336ABN3     | false      |
+----------+----------+--------+--------------+----------+-----------+------------------+------------+
0 голосов
/ 24 марта 2020

У вас неверное правило соответствия элементов root. Поэтому измените файл XSLT-1.0 на следующее:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/ShipNotice/Items">
    <html>
      <body>
        <xsl:for-each select="Item">
          <xsl:value-of select="/ShipNotice/@PONumber" />
          <xsl:value-of select="/ShipNotice/@DropShip" />
          <xsl:value-of select="/ShipNotice/@Branch" />
          <xsl:value-of select="/ShipNotice/@ShipNoticeId" />
          <xsl:value-of select="Quantity" />
          <xsl:value-of select="UnitPrice" />
          <xsl:value-of select="SellerPartNumber" />
          <xsl:value-of select="ItemDescription" />
          <xsl:value-of select="Serialized" />
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...