XSLT-匹配谓词中的变量元素

XSLT-匹配谓词中的变量元素,xslt,Xslt,工作很好,但我想使用 <xsl:apply-templates select="element[child='Yes']"> 所以我可以使用一个变量来指定节点 比如说 <xsl:apply-templates select="element[$childElementName='Yes']"> 因以下原因而被罚款: <xsl:apply-templates select="theList/entity[Central='Yes']"> 第一公司

工作很好,但我想使用

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

所以我可以使用一个变量来指定节点

比如说

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

因以下原因而被罚款:

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

第一公司
123456
对
不
对
不
不
公司2
123456
不
对
不
不
对
公司3
123456
对
不
不
不
不
公司4
123456
不
不
不
不
不
但我不希望硬编码子元素名称

有什么建议吗

谢谢Tim的回答:

<?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>

您可以使用local-name()函数测试元素的名称,如下所示

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

这将检查名称为“Central”的所有子节点

然后,您可以轻松地用参数或变量替换硬编码。因此,如果对XML输入使用以下XSLT:

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

中心的
您将获得输出

<?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>
公司1公司3
使用

<Name>Company 1</Name><Name>Company 3</Name>

选择任何具有值为
Yes
的子节点的
实体
不会实现同样的效果吗?好问题(+1)。请参阅我的答案,以获得一个非常简短的解决方案。:)回答得好。但是,我认为必须指出,使用
local-name()
可以选择任何名称空间中的每个
Central
元素(包括空)。使用
name()
选择空命名空间或默认命名空间中的每个
Central
元素。要进行严格匹配,必须添加
命名空间-uri()
条件。
theList/entity/*[name() = $childElementName][. = 'Yes']