1

在我的 xml 中,我希望特定menuitems/menuitem节点位于其父级下的不同任意位置(我不想要硬编码的位置选择器)。

是否可以menuitem在其下的 name 元素中获得具有正确值的节点的位置,即menuitems/menuitem/name. 简而言之:选择menuitem它下面有正确name值的那个。

<one>
   <menuitems>
      <menuitem>  <!-- I dont want this one -->
         <name>
           ...
         </name>
      </menuitem>

      <menuitem>   <!-- I want this one at position 2 under <one> -->
         <name>
            ...    <!-- Based one correct name value here --> 
        </name>
      </menuitem>
   </menuitems>

</one>
<two>
  <menuitems>
    <menuitem> <!-- I want this one at position 1 under <two> -->
       <name>
          ...
       </name>
     </menuitem>
   </menuitems>
</two>

我可以很容易地找出menuitem下面menuitems的值是否正确name。像这样:

 <xsl:value-of select="current()/menuitems/menuitem/name = 'OhYes'"></xsl:value-of>

哪个会返回true。但是,这是在哪个位置menuitem返回menuitemtrue呢?在同一父级和同一级别下进行选择。

我想避免这种情况:

<xsl:if test="current()/menuitems/menuitem[1]/name = 'OhYes'"> .. </xsl:if>
<xsl:if test="current()/menuitems/menuitem[2]/name = 'OhYes'"> .. </xsl:if>
4

2 回答 2

0

您可以首先使用 getElementsByTagName 分离出一个和两个容器。对于每个部分(一、二),尝试通过使用 getElementsByTagName 创建一个数组来遍历所有名称,然后检查每个元素以查看名称是否正确。由于每个 menuitem 位置对应于每个标题下的名称位置(一、二),因此您可以在每个匹配的名称节点上使用 .parentNode 访问器来返回 menuitem 节点,并使用迭代器的索引来返回其位置。

例如,对于 XML 代码

    <one>
   <menuitems>
      <menuitem>  <!-- I dont want this one -->
         <name>
            the incorrect name
         </name>
      </menuitem>
   </menuitems>

   <menuitems>
      <menuitem> <!-- I want this one at position 2 -->
        <name>
           the correct name   <!-- Based one correct name value here --> 
        </name>
      </menuitem>
   </menuitems>
</one>
<two>
  <menuitems>
    <menuitem> <!-- I want this one at position 1 -->
       <name>
          the correct name
       </name>
     </menuitem>
   </menuitems>
</two>

以下代码提醒当前容器(一、二)下的名称节点(和父菜单项)的索引,这些名称节点在标记为“正确名称”的标签中包含正确的名称文本

names = new Array();

// Find the correct position for the menuitem under one
one = document.getElementsByTagName("one")[0];

names = one.getElementsByTagName("name");

for (var i=0; i<names.length; i++){
    if (names[i].innerHTML.search("the correct name") >= 0)
        alert("For one: Correct name found at name node index " + (i+1) + " and its parent menuitem is " + names[i].parentNode);

    // names[i].parentNode is the reference to the menuitem in one that contains the correct name
}   

// Find the correct position for the menuitem under two
two = document.getElementsByTagName("two")[0];

names = two.getElementsByTagName("name");

for (var i=0; i<names.length; i++){
    if (names[i].innerHTML.search("the correct name") >= 0)
        alert("For two: Correct name found at name node index " + (i+1) + " and its parent menuitem is " + names[i].parentNode);

    // names[i].parentNode is the reference to the menuitem in one that contains the correct name

}

我还在http://jsfiddle.net/nMN3j/1/创建了一个小提琴,所以你可以尝试一下,看看它是如何工作的。

此代码将提醒在容器“one”下,在位置 2 找到了具有正确名称子选项卡的 menuitem 标记,但在位置 1 未找到具有不正确名称子标记的位置 1。

对于容器“二”,代码将提醒在位置 1 找到了具有正确名称的菜单项。

希望这可以帮助!

于 2013-04-05T13:53:02.263 回答
0

使用这个

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:for-each select="/*/*/menuitems/menuitem[name='OhYes']">
   position: <xsl:text/>
    <xsl:value-of select="count(preceding-sibling::menuitem) +1"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

**当此转换应用于以下 XML 文档时:... --> OhYes --> OhYes

产生了想要的正确结果

   position: 2
   position: 1
于 2013-04-05T14:40:02.647 回答