XSLT: как скопировать вывод преобразования идентичности в переменную xslt? - PullRequest
0 голосов
/ 12 сентября 2018

Используя следующий код, я заменяю все вхождения элемента QUOTE внутри моего XML-ввода строкой, являющейся значением атрибута QUOTE / @ ID.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="QUOTE">
      <xsl:value-of select="@ID"/>
  </xsl:template>

</xsl:stylesheet>

Теперь я хочуСкопируйте выходные данные вышеупомянутого преобразования в переменную, чтобы передать его в качестве параметра в шаблон, а затем примените XPATH к этой переменной следующим образом:

<xsl:template name="second-pass">
    <!-- variable which holds the identity transformation -->   
    <xsl:param name="pre-processed-xml"/>
    <!-- call SUMMARY template with parameter -->      
    <xsl:call-template name="SUMMARY">
        <xsl:with-param name="pre-processed-xml" select="exsl:node-set($pre-processed-xml)"/>
    </xsl:call-template>
</xsl:template>

<!-- SUMMARY template -->
<xsl:template name="SUMMARY">
   <xsl:param name="pre-processed-xml"/>
   <xsl:value-of select="$pre-processed-xml//SUMMARY"> 
</xsl:template>

У меня следующие вопросы:

  1. Как я могу скопировать выходные данные преобразования идентификаторов в переменную?
  2. Как вызвать шаблон "второго прохода" после того, как преобразование идентификаторов завершено и скопировано в переменную?

1 Ответ

0 голосов
/ 12 сентября 2018

Что вы можете сделать, это просто сопоставить узел документа /, а затем сохранить результаты xsl:apply-templates в переменной, которую затем можно передать в second-pass шаблон

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common">
  <xsl:template match="/">
    <xsl:variable name="doc">
      <xsl:apply-templates />
    </xsl:variable>
    <xsl:call-template name="second-pass">
      <xsl:with-param name="pre-processed-xml" select="$doc" />
    </xsl:call-template>
  </xsl:template>

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

  <xsl:template match="QUOTE">
    <xsl:value-of select="@ID"/>
  </xsl:template>

  <xsl:template name="second-pass">
    <!-- variable which holds the identity transformation -->   
    <xsl:param name="pre-processed-xml"/>
    <!-- call SUMMARY template with parameter -->      
    <xsl:call-template name="SUMMARY">
      <xsl:with-param name="pre-processed-xml" select="exsl:node-set($pre-processed-xml)"/>
    </xsl:call-template>
  </xsl:template>

  <!-- SUMMARY template -->
  <xsl:template name="SUMMARY">
    <xsl:param name="pre-processed-xml"/>
    <xsl:value-of select="$pre-processed-xml//SUMMARY" /> 
  </xsl:template>
</xsl:stylesheet>

.сказал, что это кажется немного чрезмерным.Учитывая то, что вы показали в вопросе, вы можете достичь того же результата, просто сделав это ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:apply-templates select="//SUMMARY" />
  </xsl:template>

  <xsl:template match="QUOTE">
    <xsl:value-of select="@ID"/>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...