2016-09-06 9 views
0

希望の出力を達成するためのXSLTマッピングとヘルプを探す初心者。私は入力XMLをそのまま出力したい。 空のxmls = ""属性を/ Inventory/Actionに追加するxsl:copy-of selectを使ってみましたが、これはターゲットでは受け入れられません。 また、xsl:for-eachをAdActionのような要素のXSLT値以下で使用しようとすると、ユニット< 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? –