Ограничение раздела XSLT одним узлом - PullRequest
5 голосов
/ 29 марта 2012

Есть ли способ ограничить секцию XSLT одним узлом, чтобы каждый раз не требовался полный путь узла?

Например ...

Name: <xsl:value-of select="/root/item[@attrib=1]/name"/>
Age: <xsl:value-of select="/root/item[@attrib=1]/age"/>

Это можно сделать с помощью команды «для каждого», но я склонен полагать, что их следует избегать, если это вообще возможно ...

<xsl:for-each select="/root/item[@attrib=1]"/>
  Name: <xsl:value-of select="name"/>
  Age: <xsl:value-of select="age"/>
</xsl:for-each>

Наверное, я спрашиваю, есть лиXSLT-эквивалент команды VB.NET With?

Я бы предпочел избегать xsl: template для удобства чтения, так как рассматриваемый файл XSLT большой, но с радостью приму, если это единственный способ сделать это.И если да, то каков синтаксис для вызова определенного шаблона на основе определенного узла?

Обновление

В ответ на ответ @javram возможносопоставлять отдельные шаблоны на основе определенных атрибутов / узлов.

<xsl:apply-templates select="/root/item[@attrib=1]"/>
<xsl:apply-templates select="/root/item[@attrib=2]"/>

<xsl:template match="/root/item[@attrib=1]">
  Name: <xsl:value-of select="name"/>
  Age: <xsl:value-of select="age"/>
</xsl:template>

<xsl:template match="/root/item[@attrib=2]">
  Foo: <xsl:value-of select="foo"/>
</xsl:template>

Ответы [ 4 ]

2 голосов
/ 30 марта 2012

Правильный способ будет использовать шаблон:

<xsl:apply-templates select="/root/item[@attrib=1]"/>

.
.
.

<xsl:template match="/root/item">
     Name: <xsl:value-of select="name"/>
     Age: <xsl:value-of select="age"/>
</xsl:template>
2 голосов
/ 29 марта 2012

Вы можете использовать переменные:

<xsl:variable name="foo" select="/root/item[@attrib=1]" />

<xsl:value-of select="$foo/name" />
<xsl:value-of select="$foo/age" />
0 голосов
/ 17 октября 2013

Это:

<xsl:for-each select="/root/item[@attrib=1]"/>
  Name: <xsl:value-of select="name"/>
  Age: <xsl:value-of select="age"/>
</xsl:for-each>

опускается во все узлы (каждый соответствующий узел, один за другим).

Это:

<xsl:for-each select="(/root/item[@attrib=1])[1]"/>
  Name: <xsl:value-of select="name"/>
  Age: <xsl:value-of select="age"/>
</xsl:for-each>

спускается в первый (возможно, единственный) совпадающий узел и эквивалентен выражению VB.NET With, как вы пожелаете.

0 голосов
/ 29 марта 2012

В XSLT 2.0 другой возможный стиль:

<xsl:value-of select='/root/item[@attrib=1]/
                       concat("Name: ", name, " Age: ", age)'/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...