2016-09-06 3 views
0

Iam 초보자가 XSLT 매핑을 수행하고 원하는 결과를 얻기 위해 도움을 요청합니다. 입력 XML을 그대로 출력하고 싶습니다. xsl : copy-of select를 사용하여 대상에서 허용되지 않는/Inventory/Action에 빈 xmls = ""속성을 추가하려고했습니다. 또한 AdAction과 같은 요소에 대해 XSLT 값 이하를 사용하여 xsl : for-each를 시도하면 각 반복마다 단위 < 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

Hello Michael, 문제는 이해하지만 xslt 매핑을 통해 현재 경로를 선택하는 방법을 모르겠습니다. – ks1985

+0

이 기능이 작동합니까? http://xsltransform.net/bFWR5DQ? –