2016-09-06 170 views
0

Iam新手到XSLT映射並尋求幫助來實現所需的輸出。我想將輸入XML按原樣複製到輸出中。 我已經嘗試使用xsl:copy-of select,它將在目錄中無法接受的/ Inventory/Action中添加一個空xml =「」屬性。 此外,當我嘗試xsl:for-每個元素都使用以下XSLT值(例如AdAction)時,單元< 4567 7896>和ID < 12345 67890> QU < 200 100>正在爲每次迭代重複。XSLT映射轉換

輸入XML。

<?xml version="1.0" encoding="UTF-8"?> 
<Body> 
    <Inventory> 
    <Action MessageType="hello" Type="hi" Action="hand"  InventoryState="avail"> 
     <DateTime/> 
     <Ad Action="Set"> 
      <Position> 
       <Unit TypeCode="abc">4567</Unit> 
       <Item> 
       <ID>12345</ID> 
       </Item> 
      </Position> 
      <Qu>200</Qu> 
     </Ad> 
    </Action> 
      <Action MessageType="hello" Type="hi" Action="hand" InventoryState="avail"> 
     <DateTime/> 
     <Ad Action="Set"> 
      <Position> 
       <Unit TypeCode="abc">7896</Unit> 
       <Item> 
       <ID>67890</ID> 
       </Item> 
      </Position> 
      <Qu>100</Qu> 
     </Ad> 
    </Action> 
    </Inventory> 

XSLT映射我已經使用。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="xsl"> 
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="/"> 
    <Body> 
     <xsl:for-each select="//Action"> 
      <Action> 
       <xsl:attribute name="Type">hello</xsl:attribute> 
       <xsl:attribute name="AType">hi</xsl:attribute> 
       <xsl:attribute name="Action">hand</xsl:attribute> 
       <xsl:attribute name="State">avail</xsl:attribute> 
       <DateTime>DateTime</DateTime> 
       <Ad> 
        <xsl:attribute name="Action"><xsl:value-of select="//Ad/@Action"/></xsl:attribute> 
        <Position> 
         <Unit> 
          <xsl:attribute name="TypeCode">Store</xsl:attribute> 
         </Unit> 
         <Item> 
          <ID> 
           <xsl:value-of select="//Action/Ad/Position/Item/ID"/> 
          </ID> 
         </Item> 
        </Position> 
        <Qu> 
         <xsl:value-of select="//Action/Ad/Qu"/> 
        </Qu> 
       </Ad> 
      </Action> 
     </xsl:for-each> 
    </Body> 
</xsl:template> 

輸出:

<Body xmlns="http://www.w3.org/1999/XSL/Format"> 
<Action Type="hello" AType="hi" Action="hand" State="avail"> 
    <DateTime>DateTime</DateTime> 
    <Ad Action="Set Set"> 
     <Position> 
      <Unit TypeCode="Store"/> 
      <Item> 
       <ID>12345 67890</ID> 
      </Item> 
     </Position> 
     <Qu>200 100</Qu> 
    </Ad> 
</Action> 
<Action Type="hello" AType="hi" Action="hand" State="avail"> 
    <DateTime>DateTime</DateTime> 
    <Ad Action="Set Set"> 
     <Position> 
      <Unit TypeCode="Store"/> 
      <Item> 
       <ID>12345 67890</ID> 
      </Item> 
     </Position> 
     <Qu>200 100</Qu> 
    </Ad> 
</Action> 

所需的輸出沒有重複值。

<Body xmlns="http://www.w3.org/1999/XSL/Format"> 
<Action Type="hello" AType="hi" Action="hand" State="avail"> 
    <DateTime>DateTime</DateTime> 
    <Ad Action="Set"> 
     <Position> 
      <Unit TypeCode="Store"/> 
      <Item> 
       <ID>12345</ID> 
      </Item> 
     </Position> 
     <Qu>200</Qu> 
    </Ad> 
</Action> 
<Action Type="hello" AType="hi" Action="hand" State="avail"> 
    <DateTime>DateTime</DateTime> 
    <Ad Action="Set"> 
     <Position> 
      <Unit TypeCode="Store"/> 
      <Item> 
       <ID>67890</ID> 
      </Item> 
     </Position> 
     <Qu>100</Qu> 
    </Ad> 
</Action> 

+0

也許是很方便的瞭解更多關於你的代碼,你做了什麼。所以不要在這裏粘貼所有的代碼並等待正確的答案。 :) – Arendax

回答

0

變化:

<xsl:value-of select="//Action/Ad/Position/Item/ID"/> 

到:

<xsl:value-of select="Ad/Position/Item/ID"/> 

你有什麼是絕對路徑,從根開始的 - 它會在選擇每一個項目ID整個文件。您需要的是相對路徑,從當前的Action開始。

同樣的變化:

<xsl:value-of select="//Action/Ad/Qu"/> 

到:

<xsl:value-of select="Ad/Qu"/> 
+0

使用獲得相同的結果。 – ks1985

+0

你好邁克爾,我明白問題,但我不知道如何通過xslt映射選擇當前路徑。 – ks1985

+0

這是否適合你:http://xsltransform.net/bFWR5DQ? –