Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT1.0:应用模板和模板模式_Xslt_Mode_Apply Templates - Fatal编程技术网

XSLT1.0:应用模板和模板模式

XSLT1.0:应用模板和模板模式,xslt,mode,apply-templates,Xslt,Mode,Apply Templates,我有以下XML: <?xml version="1.0" encoding="UTF-8"?> <Order> <Item> <RECORD_ID>RECORD_ID</RECORD_ID> <ENTITY_CODE>ENTITY_CODE</ENTITY_CODE> <USER_CODE>USER_CODE</USER_CODE> <RECORD_D

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
<Item>
    <RECORD_ID>RECORD_ID</RECORD_ID>
    <ENTITY_CODE>ENTITY_CODE</ENTITY_CODE>
    <USER_CODE>USER_CODE</USER_CODE>
    <RECORD_DATE>RECORD_DATE</RECORD_DATE>
    <ITEM_CODE>ITEM_CODE</ITEM_CODE>
    <LINE_QUANTITY>LINE_QUANTITY</LINE_QUANTITY>
    <LINE_FREE_STOCK>LINE_FREE STOCK</LINE_FREE_STOCK>
    <LINE_PRICE>LINE_PRICE</LINE_PRICE>
    <LINE_DISCOUNT_PERCENT>LINE_DISCOUNT PERCENT</LINE_DISCOUNT_PERCENT>
</Item>
<Item>
    <RECORD_ID>9046</RECORD_ID>
    <ENTITY_CODE>12010601</ENTITY_CODE>
    <USER_CODE>122</USER_CODE>
    <RECORD_DATE>2011-08-24</RECORD_DATE>
    <ITEM_CODE>804-008165</ITEM_CODE>
    <LINE_QUANTITY>2</LINE_QUANTITY>
    <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
</Item>
<Item>
    <RECORD_ID>9046</RECORD_ID>
    <ENTITY_CODE>12010601</ENTITY_CODE>
    <USER_CODE>122</USER_CODE>
    <RECORD_DATE>2011-08-24</RECORD_DATE>
    <ITEM_CODE>804-008161</ITEM_CODE>
    <LINE_QUANTITY>1</LINE_QUANTITY>
    <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
</Item>
<Item>
    <RECORD_ID>9046</RECORD_ID>
    <ENTITY_CODE>12010601</ENTITY_CODE>
    <USER_CODE>122</USER_CODE>
    <RECORD_DATE>2011-08-24</RECORD_DATE>
    <ITEM_CODE>804-008225</ITEM_CODE>
    <LINE_QUANTITY>5</LINE_QUANTITY>
</Item>
</Order>
它创建了这个(简化的)想要的输出:

<?xml version="1.0" encoding="UTF-8"?>
<ORDERS05>
<IDOC BEGIN="1">
    <Header>some header data</Header>
    <position>
        <item>
            <number>804-008165</number>
            <quantity>2</quantity>
        </item>
    </position>
    <position>
        <item>
            <number>804-008161</number>
            <quantity>1</quantity>
        </item>
    </position>
    <position>
        <item>
            <number>804-008225</number>
            <quantity>5</quantity>
        </item>
    </position>
    <position>
        <item>
            <number>804-008165</number>
            <freestock_quant>1</freestock_quant>
        </item>
    </position>
    <position>
        <item>
            <number>804-008161</number>
            <freestock_quant>1</freestock_quant>
        </item>
    </position>
</IDOC>
</ORDERS05>

一些标题数据
804-008165
2.
804-008161
1.
804-008225
5.
804-008165
1.
804-008161
1.
804-008165和804-008161显示两次-一次作为标准项,一次作为自由库存项,并显示各自的数量

但是我忘了什么吗?有什么我看不到的陷阱吗? XSLT足够健壮吗? 非常感谢您的任何想法或更正

致以最良好的祝愿,
Peter

这是因为您有两个项目匹配模板:

<xsl:template match="Item">
  <xsl:if test="position() &gt; 1">
    <position>
      <item>
        <number><xsl:value-of select="ITEM_CODE"/></number>
        <quantity><xsl:value-of select="LINE_QUANTITY"/></quantity>
      </item>
    </position>
  </xsl:if>
</xsl:template>

<xsl:template match="Item[child::LINE_FREE_STOCK]" mode="freestock">
  <xsl:if test="position() &gt; 1">            
    <position>
      <item>
        <number><xsl:value-of select="ITEM_CODE"/></number>
        <freestock_quant><xsl:value-of select="LINE_FREE_STOCK"/></freestock_quant>
      </item>
    </position>
  </xsl:if>
</xsl:template>

首先,默认项目模板匹配,然后项目的第\行自由\库存也匹配子第\行自由\库存模板的项目,因此项目的第\行自由\库存重复

相反,为什么不使用一个模板,如下所示:

<xsl:template match="Item">
  <xsl:if test="position() &gt; 1">
    <position>
      <item>
        <number><xsl:value-of select="ITEM_CODE"/></number>
        <xsl:choose>
          <xsl:when test="child::LINE_FREE_STOCK">
            <freestock_quant><xsl:value-of select="LINE_FREE_STOCK"/></freestock_quant>
          </xsl:when>
          <xsl:otherwise>
            <quantity><xsl:value-of select="LINE_QUANTITY"/></quantity>
          </xsl:otherwise>
        </xsl:choose>
      </item>
    </position>
  </xsl:if>
</xsl:template>

使用单一模板,您的订单模板也得到简化:

<xsl:template match="Order">
  <Header>
    <xsl:value-of select="'some header data'"/>
  </Header>
  <xsl:apply-templates select="Item"/>
</xsl:template>


这样,您也不需要使用模式。

不清楚想要的输出是什么。也许你想要:

<xsl:apply-templates select="Item[not(LINE_FREE_STOCK)"/>
<xsl:apply-templates select="Item[LINE_FREE_STOCK]" mode="freestock"/>

代替你的

  <xsl:apply-templates select="Item"/>
  <xsl:apply-templates select="Item[child::LINE_FREE_STOCK]" mode="freestock"/>

您需要添加一个过滤

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="UTF-8" method="xml" indent="yes"/>

<xsl:template match="/">
    <ORDERS05>
        <IDOC BEGIN="1">
            <xsl:apply-templates select="Order"/>
        </IDOC>
    </ORDERS05>
</xsl:template>

<xsl:template match="Order">
    <Header>
        <xsl:value-of select="'some header data'"/>
    </Header>
    <xsl:apply-templates select="Item[not(child::LINE_FREE_STOCK)]"/>
    <xsl:apply-templates select="Item[child::LINE_FREE_STOCK]" mode="freestock"/>
</xsl:template>

<xsl:template match="Item">
    <xsl:if test="position() &gt; 1">
        <position>
            <item>
                <number><xsl:value-of select="ITEM_CODE"/></number>
                <quantity><xsl:value-of select="LINE_QUANTITY"/></quantity>
            </item>
        </position>
    </xsl:if>
</xsl:template>

<xsl:template match="Item[child::LINE_FREE_STOCK]" mode="freestock">
    <xsl:if test="position() &gt; 1">            
        <position>
            <item>
                <number><xsl:value-of select="ITEM_CODE"/></number>
                <freestock_quant><xsl:value-of select="LINE_FREE_STOCK"/></freestock_quant>
            </item>
        </position>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

正如其他人所指出的,问题在于此代码中:

<xsl:apply-templates select="Item"/> 
<xsl:apply-templates select="Item[child::LINE_FREE_STOCK]" mode="freestock"/> 
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output encoding="UTF-8" indent="yes"/>

 <xsl:template match="/">
    <ORDERS05>
        <IDOC BEGIN="1">
            <xsl:apply-templates select="Order"/>
        </IDOC>
    </ORDERS05>
 </xsl:template>

 <xsl:template match="Order">
    <Header>
        <xsl:value-of select="'some header data'"/>
    </Header>
        <xsl:apply-templates select="Item[position() >1]"/>
 </xsl:template>

 <xsl:template match="Item">
  <position>
    <item>
      <number>
        <xsl:value-of select="ITEM_CODE"/>
      </number>

      <xsl:apply-templates select=
        "self::node()[not(LINE_FREE_STOCK)]/LINE_QUANTITY
       |
         LINE_FREE_STOCK"/>
     </item>
  </position>
 </xsl:template>

 <xsl:template match="LINE_QUANTITY">
   <quantity>
     <xsl:value-of select="."/>
   </quantity>
 </xsl:template>

 <xsl:template match="LINE_FREE_STOCK">
   <freestock_quant>
     <xsl:value-of select="."/>
   </freestock_quant>
 </xsl:template>
</xsl:stylesheet>
<Order>
    <Item>
        <RECORD_ID>RECORD_ID</RECORD_ID>
        <ENTITY_CODE>ENTITY_CODE</ENTITY_CODE>
        <USER_CODE>USER_CODE</USER_CODE>
        <RECORD_DATE>RECORD_DATE</RECORD_DATE>
        <ITEM_CODE>ITEM_CODE</ITEM_CODE>
        <LINE_QUANTITY>LINE_QUANTITY</LINE_QUANTITY>
        <LINE_FREE_STOCK>LINE_FREE STOCK</LINE_FREE_STOCK>
        <LINE_PRICE>LINE_PRICE</LINE_PRICE>
        <LINE_DISCOUNT_PERCENT>LINE_DISCOUNT PERCENT</LINE_DISCOUNT_PERCENT>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008165</ITEM_CODE>
        <LINE_QUANTITY>2</LINE_QUANTITY>
        <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008161</ITEM_CODE>
        <LINE_QUANTITY>1</LINE_QUANTITY>
        <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008225</ITEM_CODE>
        <LINE_QUANTITY>5</LINE_QUANTITY>
    </Item>
</Order>
<ORDERS05>
   <IDOC BEGIN="1">
      <Header>some header data</Header>
      <position>
         <item>
            <number>804-008165</number>
            <freestock_quant>1</freestock_quant>
         </item>
      </position>
      <position>
         <item>
            <number>804-008161</number>
            <freestock_quant>1</freestock_quant>
         </item>
      </position>
      <position>
         <item>
            <number>804-008225</number>
            <quantity>5</quantity>
         </item>
      </position>
   </IDOC>
</ORDERS05>
当此转换应用于提供的XML文档时

<xsl:apply-templates select="Item"/> 
<xsl:apply-templates select="Item[child::LINE_FREE_STOCK]" mode="freestock"/> 
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output encoding="UTF-8" indent="yes"/>

 <xsl:template match="/">
    <ORDERS05>
        <IDOC BEGIN="1">
            <xsl:apply-templates select="Order"/>
        </IDOC>
    </ORDERS05>
 </xsl:template>

 <xsl:template match="Order">
    <Header>
        <xsl:value-of select="'some header data'"/>
    </Header>
        <xsl:apply-templates select="Item[position() >1]"/>
 </xsl:template>

 <xsl:template match="Item">
  <position>
    <item>
      <number>
        <xsl:value-of select="ITEM_CODE"/>
      </number>

      <xsl:apply-templates select=
        "self::node()[not(LINE_FREE_STOCK)]/LINE_QUANTITY
       |
         LINE_FREE_STOCK"/>
     </item>
  </position>
 </xsl:template>

 <xsl:template match="LINE_QUANTITY">
   <quantity>
     <xsl:value-of select="."/>
   </quantity>
 </xsl:template>

 <xsl:template match="LINE_FREE_STOCK">
   <freestock_quant>
     <xsl:value-of select="."/>
   </freestock_quant>
 </xsl:template>
</xsl:stylesheet>
<Order>
    <Item>
        <RECORD_ID>RECORD_ID</RECORD_ID>
        <ENTITY_CODE>ENTITY_CODE</ENTITY_CODE>
        <USER_CODE>USER_CODE</USER_CODE>
        <RECORD_DATE>RECORD_DATE</RECORD_DATE>
        <ITEM_CODE>ITEM_CODE</ITEM_CODE>
        <LINE_QUANTITY>LINE_QUANTITY</LINE_QUANTITY>
        <LINE_FREE_STOCK>LINE_FREE STOCK</LINE_FREE_STOCK>
        <LINE_PRICE>LINE_PRICE</LINE_PRICE>
        <LINE_DISCOUNT_PERCENT>LINE_DISCOUNT PERCENT</LINE_DISCOUNT_PERCENT>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008165</ITEM_CODE>
        <LINE_QUANTITY>2</LINE_QUANTITY>
        <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008161</ITEM_CODE>
        <LINE_QUANTITY>1</LINE_QUANTITY>
        <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008225</ITEM_CODE>
        <LINE_QUANTITY>5</LINE_QUANTITY>
    </Item>
</Order>
<ORDERS05>
   <IDOC BEGIN="1">
      <Header>some header data</Header>
      <position>
         <item>
            <number>804-008165</number>
            <freestock_quant>1</freestock_quant>
         </item>
      </position>
      <position>
         <item>
            <number>804-008161</number>
            <freestock_quant>1</freestock_quant>
         </item>
      </position>
      <position>
         <item>
            <number>804-008225</number>
            <quantity>5</quantity>
         </item>
      </position>
   </IDOC>
</ORDERS05>

记录ID
实体代码
用户代码
记录日期
项目代码
行数
免费库存
线价
行u折扣百分比
9046
12010601
122
2011-08-24
804-008165
2.
1.
9046
12010601
122
2011-08-24
804-008161
1.
1.
9046
12010601
122
2011-08-24
804-008225
5.
生成所需的正确结果

<xsl:apply-templates select="Item"/> 
<xsl:apply-templates select="Item[child::LINE_FREE_STOCK]" mode="freestock"/> 
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output encoding="UTF-8" indent="yes"/>

 <xsl:template match="/">
    <ORDERS05>
        <IDOC BEGIN="1">
            <xsl:apply-templates select="Order"/>
        </IDOC>
    </ORDERS05>
 </xsl:template>

 <xsl:template match="Order">
    <Header>
        <xsl:value-of select="'some header data'"/>
    </Header>
        <xsl:apply-templates select="Item[position() >1]"/>
 </xsl:template>

 <xsl:template match="Item">
  <position>
    <item>
      <number>
        <xsl:value-of select="ITEM_CODE"/>
      </number>

      <xsl:apply-templates select=
        "self::node()[not(LINE_FREE_STOCK)]/LINE_QUANTITY
       |
         LINE_FREE_STOCK"/>
     </item>
  </position>
 </xsl:template>

 <xsl:template match="LINE_QUANTITY">
   <quantity>
     <xsl:value-of select="."/>
   </quantity>
 </xsl:template>

 <xsl:template match="LINE_FREE_STOCK">
   <freestock_quant>
     <xsl:value-of select="."/>
   </freestock_quant>
 </xsl:template>
</xsl:stylesheet>
<Order>
    <Item>
        <RECORD_ID>RECORD_ID</RECORD_ID>
        <ENTITY_CODE>ENTITY_CODE</ENTITY_CODE>
        <USER_CODE>USER_CODE</USER_CODE>
        <RECORD_DATE>RECORD_DATE</RECORD_DATE>
        <ITEM_CODE>ITEM_CODE</ITEM_CODE>
        <LINE_QUANTITY>LINE_QUANTITY</LINE_QUANTITY>
        <LINE_FREE_STOCK>LINE_FREE STOCK</LINE_FREE_STOCK>
        <LINE_PRICE>LINE_PRICE</LINE_PRICE>
        <LINE_DISCOUNT_PERCENT>LINE_DISCOUNT PERCENT</LINE_DISCOUNT_PERCENT>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008165</ITEM_CODE>
        <LINE_QUANTITY>2</LINE_QUANTITY>
        <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008161</ITEM_CODE>
        <LINE_QUANTITY>1</LINE_QUANTITY>
        <LINE_FREE_STOCK>1</LINE_FREE_STOCK>
    </Item>
    <Item>
        <RECORD_ID>9046</RECORD_ID>
        <ENTITY_CODE>12010601</ENTITY_CODE>
        <USER_CODE>122</USER_CODE>
        <RECORD_DATE>2011-08-24</RECORD_DATE>
        <ITEM_CODE>804-008225</ITEM_CODE>
        <LINE_QUANTITY>5</LINE_QUANTITY>
    </Item>
</Order>
<ORDERS05>
   <IDOC BEGIN="1">
      <Header>some header data</Header>
      <position>
         <item>
            <number>804-008165</number>
            <freestock_quant>1</freestock_quant>
         </item>
      </position>
      <position>
         <item>
            <number>804-008161</number>
            <freestock_quant>1</freestock_quant>
         </item>
      </position>
      <position>
         <item>
            <number>804-008225</number>
            <quantity>5</quantity>
         </item>
      </position>
   </IDOC>
</ORDERS05>

一些标题数据
804-008165
1.
804-008161
1.
804-008225
5.

问得好,+1。请参阅我的答案,以了解问题的解释以及重构和缩短的解决方案,该解决方案不需要模式或任何明确的cslt条件指令。您好,用户905927,感谢您的回复。对不起,我没有很好地阐述我的问题。我只想修改我的代码。我得到的结果就是我想要的。每个“行数量”1个记录集,每个“行自由库存”1个记录集。感谢你的努力-谢谢你,彼得·保罗,谢谢你的回复。对不起,我没有很好地阐述我的问题。我只想修改我的代码。我得到的结果就是我想要的。每个“行数量”1个记录集,每个“行自由库存”1个记录集。感谢你的努力-谢谢你,彼得·埃波,是的-你是对的。我的问题表述得不够清楚。很抱歉。我得到的结果正是我想要的。我只是想确认一下这是正确的做法。感谢你的努力和问候,彼得·迪米特里,谢谢你的回答。对不起,我没有很好地阐述我的问题。我得到的结果正是我想要的。每行数量1个位置,每行自由库存1个位置。我想确认一下我做得对。我确实将代码改为“Item[position()>1]”,以摆脱xsl:if。你的帖子总是很详细,读起来总是很有趣!谢谢你,向你问好,彼得