XSLT 映射转换

XSLT Mapping Transformation

我是 XSLT 映射的新手,正在寻求帮助以获得所需的输出。我想将 Input XML 按原样复制到输出中。 我尝试使用 xsl:copy-of select,它在 /Inventory/Action 中添加了一个空的 xmls=”” 属性,这是目标不可接受的。 此外,当我尝试 xsl:for-each 对 AdAction 等元素使用以下 XSLT 值时,unit<4567 7896> 和 ID<12345 67890> QU<200 100> 正在为每次迭代重复。

输入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>

变化:

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

至:

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

您拥有的是绝对路径,从根开始 - 它将 select 整个文档中的每个项目 ID。你需要的是相对路径,从当前Action.

开始

同样,改变:

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

至:

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