XSL-преобразование разрушается при обработке пустых узлов во входном XML - PullRequest
0 голосов
/ 28 мая 2019

Мое приложение генерирует отчеты HTML, применяя XSL к входному документу XML.Мы все еще используем версию 1.0 XSLT с синтаксическим анализатором Saxon (saxon9he.jar).Это работает нормально, за исключением случаев, когда во входном документе есть пустые самозакрывающиеся узлы.Ниже приведен фрагмент кода из входного XML и шаблона XSL, в котором возникла проблема при обработке ввода.

Когда ниже вызывается шаблон для любого из пустых дочерних узлов, например, для: или преобразованиявзрывается .. нет исключений .. он просто висит.Вероятно, это небольшая настройка, необходимая для обработки таких пустых узлов.

PLease предлагает правильный способ обработки пустого узла, переданного в шаблон через xsl: param, чтобы решить эту проблему!

У меня естьпопытался вставить обычный код для проверки пустой строки в параметре, но ничего не помогло.Поскольку передается узел, а не просто строка, я не уверен, как проверить наличие пустого узла через переданный параметр (xsl: param)

XML-ввод:

<Parent>
<xyz/>
<seq>0.00</seq>
<abc/>
<def/>
<name/>
<desc>PLACE HOLDER</desc>
</Parent>

XSL:

<xsl:for-each select="//zz:Parent">
<tr>
   <xsl:for-each select="*">
   <td align="left" class="whitebackground">
   <font class="tabledata">
      <xsl:if test="not(./@*)">
      <xsl:call-template name="break">
         <xsl:with-param name="text" select="."/>
      </xsl:call-template>
   </xsl:if>
   </font>
   </td>
   </xsl:for-each>
</tr>
</xsl:for-each>

xsl:template name="break">
 <xsl:param name="text"/>
 <xsl:choose>
   <xsl:when test="contains($text, '&#010;')">
     <xsl:value-of select="substring-before($text, '&#xA;')"/>
     <br/>
     <xsl:call-template name="break">
       <xsl:with-param name="text" select="substring-after($text,'&#xA;')"/>
     </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
 <!--disable-output-escaping='yes'-->
     <xsl:if test="string-length($text) > 100">
           <div style="width:200pt; word-wrap: break-word;"><xsl:value-of select="$text"/></div>
     </xsl:if>
     <xsl:if test="not(string-length($text) > 100)">
           <xsl:value-of select="$text"/>
     </xsl:if>     
   </xsl:otherwise>
 </xsl:choose>
</xsl:template>

Ожидаемый результат состоит в том, что все значения для дочерних узлов отображаются в табличном формате, включая пробелы для любых столбцов

...