2016-09-06 172 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? –