XSLT模板执行顺序

时间:2012-08-23 08:04:36

标签: xml xslt

我有一个像这样的xml文件:receipt.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xml" href="receipt.xslt"?>
    <printedslip>
      <pos>
        <posno>11546546</posno>
      </pos>
      <store>
        <storeno>1</storeno>
        <storename>Store 01</storename>
        <orgno>001</orgno>
        <postalcode>550</postalcode>
      </store>
      <cashier>
        <userno>1</userno>
        <name>Sara</name>
      </cashier>
      <headertext>Receipt Profile Header</headertext>
    </printedslip>

和xslt文件:receipt.xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="params.xslt"/>
  <xsl:include href="store.xslt"/>
  <xsl:include href="headergroup.xslt"/>

  <xsl:output method="text" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="store">
    <xsl:call-template name="store">
      <xsl:with-param name="value" select="store"/>
      <xsl:with-param name="store_no"  select="$store_no"/>    
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="headertext">
    <xsl:call-template name="receiptheader">
      <xsl:with-param name="value" select="headertext"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="cashier">
    <xsl:call-template name="cashier">
      <xsl:with-param name="value" select="cashier"/>
      <xsl:with-param name="cashier" select="$cashier"/>
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

我希望收到输出文本,该文本按照在XSLT文件中添加模板的顺序形成。相反,我按照节点出现在XML文件中的顺序首先收到商店信息,收银员和标题文本。我想从XSLT文件获得订单:store,header text,cashier。

有解决方法吗?

2 个答案:

答案 0 :(得分:4)

添加与printslip匹配的模板,然后您可以定义应该调用子元素的顺序:

<xsl:template match="printedslip">
    <xsl:apply-templates select="store"/>
    <xsl:apply-templates select="headertext"/>
    <xsl:apply-templates select="cashier"/>
</xsl:template>

否则订单取决于输入XML(商店,收银员,headertext)。 XSLT中模板的顺序不会影响printslip中元素的顺序。

通常,XSLT处理器从上到下运行输入XML中的所有元素 - 所以如果你不想要那个顺序 - 你需要告诉处理器(在xslt中)。

答案 1 :(得分:1)

我认为xsl:apply-template可以达到目标