我正在尝试转换XML文件并尝试测试节点的祖父母是否具有某个名称,但我不知道如何获取祖父母名称。这是我正在努力的例子。我试图做的是获得父母,然后找到父母的父母,但它不起作用 谢谢。
<?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>
答案 0 :(得分:1)
要查找父名称,您可以执行此操作...
<xsl:if test="name(../..)='food_XX1'">
对于祖父母......
<xsl:if test="name(../..)='food_XX1'">
请注意,根据您当前的XSLT,如果只想在food
下输出food_XX1
个节点,您可以将其重新编写为此....
<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>
答案 1 :(得分:1)
parent::
轴选择上下文节点的父节点。
在您的示例中,上下文节点是food
内正在处理的xsl:for-each
元素。 parent::food_X
相当于./parent::food_X
当您选择parent::food_X
时,它会尝试选择名为food_X
的元素,该元素是上下文节点的父节点(在本例中,它是food
元素)。然后,当试图用parent::$parentName
选择祖父母时,基本上是说,&#34;如果它是food
元素,那么就给我这个food_X
元素的父元素#34;而不是要求food_X
的父母。
为了找到$parentName
的父级,您需要使用$parentName
中的一个步骤,以便它查找$parentName
的父级,而不是food
的父级。 <xsl:if test="name($parentName/parent::*)='food_XX1'">
元素:
food_XXX1
您可以进一步简化测试。不是选择任何父元素然后测试它的名称,而是选择父元素<xsl:if test="$parentName/parent::food_XX1">
:
$parentName
更简单的是,您可以从XSLT中删除<xsl:if test="parent::food_X/parent::food_XX1">
变量并使用它:
TTTAttributedLabel
答案 2 :(得分:1)
更好的是,使用模板规则。
<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>