0

我正在尝试转换 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>
4

3 回答 3

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>
于 2018-03-09T13:17:43.007 回答
1

轴选择上下文节点的parent::父级。

在您的示例中,上下文节点是foodxsl:for-each. parent::food_X相当于./parent::food_X

当您选择parent::food_X时,它会尝试选择一个名为的元素,该元素food_X是上下文节点的父级(在本例中,它是food元素)。然后,当尝试使用 选择祖父母时,基本上是在说,“如果它是一个元素,请parent::$parentName给我这个元素的父级”,而不是询问.foodfood_Xfood_X

为了找到 的父级$parentName,您需要使用一个步骤 from $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">
于 2018-03-09T13:17:58.347 回答
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>
于 2018-03-09T14:01:43.427 回答