2013-04-05 43 views
1

在我的XML我想具体menuitems/menuitem节点,这将是在其母公司在不同的任意位置(我不想硬编码位置选择)。如何获取一个节点的基础上的子元素的值的位置

是否有可能得到menuitem节点的位置,该节点在其名称元素下具有正确的值,即menuitems/menuitem/name。简而言之:选择具有name值的menuitem

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

我可以很容易找到,如果一个menuitemmenuitems下有正确的name值。像这样:

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

这将返回true。但是,在哪个位置是该menuitem amongs其他传回truemenuitem?在同一父母和同一级别下选择。

我想避免这种情况:

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

请发布一个“工作”样本。即一个可以制作查询来展示你所要求的内容? – MattH 2013-04-05 13:42:42

+0

@MattH现在开始。 – gorn 2013-04-05 14:17:12

+2

你真的在找位置吗?或者你只是想根据它的'name'子元素内容选择一个'menuitem'元素?如果您只是使用像'// */menuitems/menuitem [name ='OhYes']'的路径,则可以选择项目元素。如果您确实想要输出位置,请使用例如''。如果您想要完整的代码,请考虑向我们展示您希望使用XSLT 2.0创建的结果的确切类型(即html或xml或文本)和内容。 – 2013-04-05 14:36:17

回答

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 
+0

是的,正确答案是使用谓词'current()/ menuitems/menuitem [name ='OhYes']'。没有循环和获得位置是不需要的。 – gorn 2013-04-08 07:17:01

+0

@gorn,不客气 – 2013-04-08 14:27:22

0

你可以先出分隔条件的getElementsByTagName使用一个和两个集装箱。为每个部分(一,二)尝试通过使用getElementsByTagName创建一个数组来遍历所有名称,然后检查每个元素以查看名称是否正确。由于每个菜单项位置对应于每个标题(一,二)的名义下的位置,你可以使用.parentNode访问每个匹配名称节点返回菜单项节点,迭代器的索引返回其位置。

例如,对于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> 

当前容器下下面的代码提醒名称节点(和父菜单项)的指数(一个,两个),该cotnain正确的名称的文本中的标签标示为“正确名称”

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/创造了小提琴,所以你可以尝试一下,看看它是如何工作的。

此代码将提醒下集装箱“的方式”菜单项tagwas位置2处,有一个正确的名称子选项卡中,而不是在位置1,它有一个不正确的名称的子标签。

集装箱“两节”,代码将提醒一个菜单项是在位置1,有一个正确的名称找到。

希望这会有所帮助!

+0

只需再次阅读问题。你是否也想要正确名称下的menuitem元素的位置? – KernelPanik 2013-04-05 13:55:34

+0

我的第一篇文章并不准确。现在查看我编辑的版本。 – gorn 2013-04-05 14:12:50

+0

没问题,我更新了我的答案,并在上面拨弄。干杯! – KernelPanik 2013-04-05 14:19:12