XSLT transform without input XML with saxon parse

徘徊边缘 提交于 2019-12-13 02:27:58

问题


Original question was here, now case slightly modified with saxon. I have following xsl tranformation:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/">
  <xsl:output method="xml" indent="yes" />
  <xsl:param name="products">
    &lt;products author=&quot;Jesper&quot;&gt;
      &lt;product id=&quot;p1&quot;&gt;
        &lt;name&gt;Delta&lt;/name&gt;
        &lt;price&gt;800&lt;/price&gt;
        &lt;stock&gt;4&lt;/stock&gt;
        &lt;country&gt;Denmark&lt;/country&gt;
      &lt;/product&gt;
      &lt;product id=&quot;p2&quot;&gt;
        &lt;name&gt;Golf&lt;/name&gt;
        &lt;price&gt;1000&lt;/price&gt;
        &lt;stock&gt;5&lt;/stock&gt;
        &lt;country&gt;Germany&lt;/country&gt;
      &lt;/product&gt;
      &lt;product id=&quot;p3&quot;&gt;
        &lt;name&gt;Alfa&lt;/name&gt;
        &lt;price&gt;1200&lt;/price&gt;
        &lt;stock&gt;19&lt;/stock&gt;
        &lt;country&gt;Germany&lt;/country&gt;
      &lt;/product&gt;
      &lt;product id=&quot;p4&quot;&gt;
        &lt;name&gt;Foxtrot&lt;/name&gt;
        &lt;price&gt;1500&lt;/price&gt;
        &lt;stock&gt;5&lt;/stock&gt;
        &lt;country&gt;Australia&lt;/country&gt;
      &lt;/product&gt;
      &lt;!-- p5 is a brand new product --&gt;
      &lt;product id=&quot;p5&quot;&gt;
        &lt;name&gt;Tango&lt;/name&gt;
        &lt;price&gt;1225&lt;/price&gt;
        &lt;stock&gt;3&lt;/stock&gt;
        &lt;country&gt;Japan&lt;/country&gt;
      &lt;/product&gt;
    &lt;/products&gt;
  </xsl:param>
  <xsl:param name="XMLproducts" select="saxon:parse($products)"></xsl:param>
  <xsl:template match="@*|node()" >
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="products">
    <xsl:copy>
      <xsl:attribute name="dateUpdated">
        <xsl:value-of select="current-dateTime()" />
      </xsl:attribute>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="/" name="initial">
    <xsl:apply-templates select="$XMLproducts"/>
  </xsl:template>
</xsl:stylesheet>

When I run this with saxon 8 transformer, I get java.lang.StackOverflowError. Any ideas why this is happening and how to solve this?


回答1:


You construct a document and apply the templates to the document node where you construct the document again and apply the templates to the document node and so on.

So use

  <xsl:template match="/" name="initial">
    <xsl:apply-templates select="$XMLproducts/node()"/>
  </xsl:template>

to prevent that problem.



来源:https://stackoverflow.com/questions/27379248/xslt-transform-without-input-xml-with-saxon-parse

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!