2016-03-31 2 views
1

Я пытаюсь преобразовать XML-файл в формат Json с использованием XSLT версии 1.0, я нахожусь в случае, когда у меня есть потенциальное количество замен, используя метод Replace на XSL. Это создает исключение StackOverFlowException.XSLT 1.0 потенциальное количество замен с помощью метода REPLACE создает исключение StackOverFlow

Метод Replace называется рекурсивно, поэтому у меня была эта проблема. Есть ли решение решить эту проблему?

<xsl:template name="replace-string"> 
    <xsl:param name="text"/> 
    <xsl:param name="replace"/> 
    <xsl:param name="with"/> 
    <xsl:choose> 
     <xsl:when test="contains($text,$replace)"> 
     <xsl:value-of select="substring-before($text,$replace)"/> 
     <xsl:value-of select="$with"/> 
     <xsl:call-template name="replace-string"> 
      <xsl:with-param name="text" select="substring-after($text,$replace)"/> 
      <xsl:with-param name="replace" select="$replace"/> 
      <xsl:with-param name="with" select="$with"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
+0

Какой процессор XSLT 1.0 вы используете? –

+0

Я не использую специальный процессор XSLT 1.0, новичок в XSLT –

+0

Запустите http://home.arcor.de/martin.honnen/xslt/processorTest2.xml через процессор и сообщите нам результаты. Или перейдите к XSLT 2.0, как это предусмотрено Saxon 9, Altova или XmlPrime. –

ответ

1

Как вы используете LibXSLT, вы можете использовать функцию EXSLT str:replace вместо рекурсивного шаблона, т.е.

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:str="http://exslt.org/strings" 
    exclude-result-prefixes="str"> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:value-of select="str:replace(., '&quot;', '\&quot;')"/> 
</xsl:template> 

</xsl:stylesheet> 

<data>This is a text with "quoted" parts</data> превращается в <data>This is a text with \"quoted\" parts</data>.

В качестве альтернативы, xsltproc, инструмент командной строки, использующий libxslt, имеет значение --maxdepth val : increase the maximum depth (default 3000), которое вы, возможно, захотите увеличить/изменить, если вам нужна более рекурсивная глубина, я думаю.

+0

Я использую libxml с C++, можете ли вы рассказать мне, как именно я могу увеличить значение maxdepth, THANKS –

+0

Я боюсь, что я не знаком с деталями C API libxslt, кто-то еще должен помочь с этим. –

+0

Я посмотрел на источник 'xsltproc' и в https://git.gnome.org/browse/libxslt/tree/xsltproc/xsltproc.c?h=v1.1.28#n476 он устанавливает' ctxt-> maxTemplateDepth' из 'xsltTransformContextPtr'. –