获取节点的祖父母的名字
Get the name of the Grandparent of a node
我正在尝试转换 XML 文件并尝试测试节点的 grandparent 是否具有特定名称,但我不知道如何获取 grandparent 名字。这是我正在研究的例子。我试图做的是获取 parent 然后找到 parent 的 parent 但它没有用。
谢谢。
<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food_XX>
<food_X>
<food>
<name>Belgian Waffles</name>
</food>
</food_X>
</food_XX>
<food_XX1>
<food_X>
<food>
<name>Strawberry Belgian Waffles</name>
</food>
</food_X>
</food_XX1>
</breakfast_menu>
这是 xsl 代码:
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:for-each select=".//food">
<xsl:variable name="parentName" select="parent::food_X" />
<xsl:value-of select="name($parentName)" />
<xsl:if test="name(parent::$parentName)='food_XX1'">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
</div>
</xsl:if>
</xsl:for-each>
</body>
</html>
要查找 parent 名称,您可以这样做...
<xsl:if test="name(../..)='food_XX1'">
还有盛大的parents....
<xsl:if test="name(../..)='food_XX1'">
请注意,鉴于您当前的 XSLT,如果仅打算在 food_XX1
下输出 food
个节点,您可以 re-write 像这样....
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:for-each select=".//food_XX1/*/food">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
</div>
</xsl:for-each>
</body>
</html>
parent::
轴 select 是上下文节点的 parent。
在您的示例中,上下文节点是 xsl:for-each
中正在处理的 food
元素。 parent::food_X
相当于 ./parent::food_X
当您 select 编辑 parent::food_X
时,它试图 select 一个名为 food_X
的元素,它是上下文节点的 parent(在在本例中,它是 food
元素)。然后,当尝试 select grandparent 和 parent::$parentName
时,本质上是在说 "give me the parent of this food
element if it is a food_X
element",而不是要求 food_X
的 parent .
为了找到$parentName
的parent,你需要使用$parentName
的一个步骤,这样它就可以找到[=]的parent 25=],而不是 food
元素的 parent:
<xsl:if test="name($parentName/parent::*)='food_XX1'">
您可以进一步简化您的测试。不是 selecting 任何 parent 元素然后测试它的名称,select parent 元素 food_XXX1
:
<xsl:if test="$parentName/parent::food_XX1">
甚至更简单,您可以从 XSLT 中删除 $parentName
变量并只使用它:
<xsl:if test="parent::food_X/parent::food_XX1">
更好的是,使用模板规则。
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:apply-templates select=".//food">
</body>
</html>
</xsl:template>
<xsl:template match="food"/>
<xsl:template match="food_XX1/*/food">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
</div>
</xsl:template>
</xsl:transform>
我正在尝试转换 XML 文件并尝试测试节点的 grandparent 是否具有特定名称,但我不知道如何获取 grandparent 名字。这是我正在研究的例子。我试图做的是获取 parent 然后找到 parent 的 parent 但它没有用。
谢谢。
<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food_XX>
<food_X>
<food>
<name>Belgian Waffles</name>
</food>
</food_X>
</food_XX>
<food_XX1>
<food_X>
<food>
<name>Strawberry Belgian Waffles</name>
</food>
</food_X>
</food_XX1>
</breakfast_menu>
这是 xsl 代码:
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:for-each select=".//food">
<xsl:variable name="parentName" select="parent::food_X" />
<xsl:value-of select="name($parentName)" />
<xsl:if test="name(parent::$parentName)='food_XX1'">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
</div>
</xsl:if>
</xsl:for-each>
</body>
</html>
要查找 parent 名称,您可以这样做...
<xsl:if test="name(../..)='food_XX1'">
还有盛大的parents....
<xsl:if test="name(../..)='food_XX1'">
请注意,鉴于您当前的 XSLT,如果仅打算在 food_XX1
下输出 food
个节点,您可以 re-write 像这样....
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:for-each select=".//food_XX1/*/food">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
</div>
</xsl:for-each>
</body>
</html>
parent::
轴 select 是上下文节点的 parent。
在您的示例中,上下文节点是 xsl:for-each
中正在处理的 food
元素。 parent::food_X
相当于 ./parent::food_X
当您 select 编辑 parent::food_X
时,它试图 select 一个名为 food_X
的元素,它是上下文节点的 parent(在在本例中,它是 food
元素)。然后,当尝试 select grandparent 和 parent::$parentName
时,本质上是在说 "give me the parent of this food
element if it is a food_X
element",而不是要求 food_X
的 parent .
为了找到$parentName
的parent,你需要使用$parentName
的一个步骤,这样它就可以找到[=]的parent 25=],而不是 food
元素的 parent:
<xsl:if test="name($parentName/parent::*)='food_XX1'">
您可以进一步简化您的测试。不是 selecting 任何 parent 元素然后测试它的名称,select parent 元素 food_XXX1
:
<xsl:if test="$parentName/parent::food_XX1">
甚至更简单,您可以从 XSLT 中删除 $parentName
变量并只使用它:
<xsl:if test="parent::food_X/parent::food_XX1">
更好的是,使用模板规则。
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:apply-templates select=".//food">
</body>
</html>
</xsl:template>
<xsl:template match="food"/>
<xsl:template match="food_XX1/*/food">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="name"/> - </span>
</div>
</xsl:template>
</xsl:transform>