XSLT - сопоставить переменный элемент в предикате - PullRequest
5 голосов
/ 27 июля 2010
<xsl:apply-templates select="element[child='Yes']">

Работает нормально, но я бы хотел использовать

<xsl:apply-templates select="element[$childElementName='Yes']">

чтобы я мог использовать переменную для указания узла.

Например

<xsl:apply-templates select="theList/entity[Central='Yes']">

отлично работает против:

<?xml version="1.0" encoding="utf-8"?>
<theList>
  <entity>
    <Business-Name>Company 1</Business-Name>
    <Phone-Number>123456</Phone-Number>
    <Central>Yes</Central>
    <region1>No</region1>
    <region2>Yes</region2>
    <region3>No</region3>
    <Northern>No</Northern>
  </entity>
  <entity>
    <Business-Name>Company 2</Business-Name>
    <Phone-Number>123456</Phone-Number>
    <Central>No</Central>
    <region1>Yes</region1>
    <region2>No</region2>
    <region3>No</region3>
    <Northern>Yes</Northern>
  </entity>
  <entity>
    <Business-Name>Company 3</Business-Name>
    <Phone-Number>123456</Phone-Number>
    <Central>Yes</Central>
    <region1>No</region1>
    <region2>No</region2>
    <region3>No</region3>
    <Northern>No</Northern>
  </entity>
  <entity>
    <Business-Name>Company 4</Business-Name>
    <Phone-Number>123456</Phone-Number>
    <Central>No</Central>
    <region1>No</region1>
    <region2>No</region2>
    <region3>No</region3>
    <Northern>No</Northern>
  </entity>
</theList>

Но я не хочу жестко кодировать имя дочернего элемента.

Есть предложения?

Спасибо, Тим за ответ:

<xsl:apply-templates select="theList/entity[child::*[name()=$childElement]='Yes']" />

Ответы [ 2 ]

3 голосов
/ 27 июля 2010

Вы можете проверить имя элемента, используя функцию local-name (), например:

<xsl:apply-templates select="theList/entity[child::*[name()='Central']='Yes']" />

Это проверяет все дочерние узлы с именем 'Central'

Затем можно легко заменить жесткое кодирование параметром или переменной. Таким образом, если вы используете следующий XSLT для ввода XML:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="childElement">Central</xsl:param>
  <xsl:template match="/">
    <xsl:apply-templates select="theList/entity[child::*[name()=$childElement]='Yes']" />
  </xsl:template>
  <xsl:template match="entity">
    <Name><xsl:value-of select="Business-Name" /></Name>
  </xsl:template>
</xsl:stylesheet>

Вы получите вывод

<Name>Company 1</Name><Name>Company 3</Name>
2 голосов
/ 27 июля 2010

Используйте

theList/entity/*[name() = $childElementName][. = 'Yes']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...