2015-01-20 4 views
0

Я новичок в xslt, и у меня есть переменная «name», в которой хранится результат преобразования, как мы можем преобразовать переменную «name», используя какой-либо другой шаблон в том же файле xslt.Применение последовательных преобразований в xslt

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="@* | node()" > 
     <xsl:variable name="name"> 
      <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
      </xsl:copy> 
     </xsl:variable> 
    </xsl:template> 
<xsl:template match="ns1:BP7Locations" > 
    <xsl:copy> 
     <xsl:apply-templates select="ns1:Entry"> 
     <xsl:sort select="ns4:Location/ns4:LocationNum" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

ответ

0

Для примера, вы можете рассмотреть этот XML:

<root> 
<a>value</a> 
</root> 

И это XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="root"> 
    <xsl:variable name="a"> 
     <xsl:apply-templates select="a" mode="mode1"/> 
    </xsl:variable> 
    <xsl:apply-templates select="exslt:node-set($a)/a" mode="mode2"/> 
</xsl:template> 
<xsl:template match="a" mode="mode1"> 
    <a><xsl:value-of select="'mode1 called'"/></a> 
</xsl:template> 
<xsl:template match="a" mode="mode2"> 
    <a><xsl:value-of select="concat(., ' mode2 called')"/></a> 
</xsl:template> 
</xsl:stylesheet> 

В результате получается следующее в качестве выходного сигнала:

<?xml version="1.0" encoding="utf-8"?> 
<a xmlns:exslt="http://exslt.org/common">mode1 called mode2 called</a> 

Первый шаблон XSLT имеет переменную a, который хранит данные после обрабатывающего элемента <a>, а затем xsl:apply-templates снова обрабатывает данные в переменной a. Здесь @mode на xsl:template отличает второй и третий шаблоны.

1

В XSLT 2.0 типичный шаблон для многофазной трансформации в это

<xsl:variable name="temp1"> 
    <xsl:apply-templates mode="phase1"/> 
</xsl:variable> 
<xsl:variable name="temp2"> 
    <xsl:apply-templates select="$temp1" mode="phase2"/> 
</xsl:variable> 
<xsl:apply-templates select="$temp2" mode="phase3"/> 

В XSLT 1.0 это не допускается, так как переменная имеет «результирующий фрагмент дерева», который может быть обработан только в очень ограниченные пути. Почти каждый процессор XSLT 1.0 реализует функцию расширения exslt: node-set(), поэтому вы можете обойти это ограничение. Код становится:

<xsl:variable name="temp1"> 
    <xsl:apply-templates mode="phase1"/> 
</xsl:variable> 
<xsl:variable name="temp2"> 
    <xsl:apply-templates select="exslt:node-set($temp1)" mode="phase2"/> 
</xsl:variable> 
<xsl:apply-templates select="exslt:node-set($temp2)" mode="phase3"/> 

Вам нужно будет добавить пространство имен xmlns:exslt="http://exslt.org/common" в таблице стилей.

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

Смежные вопросы