XSL использовать определенный шаблон внутри другого - PullRequest
0 голосов
/ 29 октября 2010

У меня есть некоторые проблемы с XSL: возможно ли использовать шаблон из другого, когда он использует apply-templates для печати потомков? Я не хочу использовать текущий узел, но действительно создаю новый элемент, соответствующий шаблону.

Пример того, что я ищу:

XML-файл:

<root>
  <toto name="foo">
    <b>hello</b>
  </toto>
</root>

Таблица стилей XSL:

<xsl:template match="/">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="tata" name="tata">
  <div class="tata">
    <xsl:apply-templates />
  </div>
</xsl:template>

<xsl:template match="toto" name="toto">
  <tata>
    <xsl:value-of select="@name" />
  </tata>
  <tata>
    <xsl:apply-templates />
  </tata>
</xsl:template>

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

Ожидаемый результат:

<div class="tata">foo</div>
<div class="tata">
  <b>hello</b>
</div>

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Если я правильно вас понимаю, вы ищете

<xsl:call-template name="tata" />

элемент.

0 голосов
/ 29 октября 2010

Нет необходимости вызывать другие шаблоны в вашей задаче.Вы можете выполнить практически всю необходимую обработку в template match="toto" На самом деле в вашем примере кода <xsl:template match="tata"> никогда не используется (с данным входным XML).Создание литерального элемента в шаблоне не приводит к вызову другого шаблона, соответствующего этому элементу.

Эта таблица стилей

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output encoding="UTF-8" indent="yes"/>

    <xsl:template match="root">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="toto">
        <div class="tata">
            <xsl:value-of select="@name"/>
        </div>
        <div class="tata">
            <xsl:apply-templates/>
        </div>
    </xsl:template>

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

</xsl:stylesheet>

с этим вводом

<root>
  <toto name="foo">
    <b>hello</b>
  </toto>
</root>

создаеттребуемый результат

<?xml version="1.0" encoding="UTF-8"?>
<div class="tata">foo</div>
<div class="tata">
<b>hello</b>
</div>

Как ответил Деннис, если вы хотите использовать шаблон из другого, используйте элемент <xsl:call-template/>.Если вы также хотите изменить текущий узел (узел контекста), вы можете использовать

<xsl:apply-templates select="path/to/new/context"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...