2015-11-04 2 views
0

Я следующее содержимое XML:Выберите XML элемент сопоставления атрибутов

<root> 
    <content> 
     <figure id="fig-001"> 
      <graphic id="fig-001-graId-001"/> 
      <graphic id="fig-001-graId-002"/> 
      <graphic id="fig-001-graId-003"/> 
     </figure> 
     <figure id="fig-002"> 
      <graphic id="fig-002-graId-001"/> 
      <graphic id="fig-002-graId-002"/> 
     </figure>   
     <refs> 
      <ref ref-id="fig-001-graId-001" type="test"/> 
      <ref ref-id="fig-002-graId-001" type="test"/> 
     </refs> 
    </content> 
</root> 

Я использую Кислородные

я нажимаю на элемент ссылки/исх, например, на

<ref ref-id="fig-01-graId-001 type="test" /> 

I хотите xpath, который считает «графический» элемент на рисунке графическим/@ id = ref/@ ref-id (когда я нажал), что-то вроде этого:

count (// content/figure/graphic [@id = // ref/@ ref-id]/parent ::/graphic) ==> 3 (родительский графический объект с ref-id = fig-001-graId -001 имеют 3 графических элементов)

+0

Какой результат вы хотите получить для этого образца ввода? –

+0

Я отредактировал мой вопрос, Извините, это было некорректно – Valeriane

+0

"* Я нажимаю на элемент refs/ref *" XPath не знает, где вы нажали. –

ответ

0

Я думаю, что вы хотите сделать:

count(//graphic[@id=//ref/@ref-id]/../graphic) 

Или, если вы предпочитаете:

count(//figure[graphic/@id=//ref/@ref-id]/graphic) 
+0

Да, но только для одного/ref/@ ref-id – Valeriane

+0

@ Valeriane Пожалуйста, объясните, что вы имеете в виду. В вашем примере ввода есть только один ref/@ ref-id. Если бы было два (или более), то оба были бы приняты во внимание. –

0

с ключом можно использовать

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:key name="id" match="figure" use="graphic/@id"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:value-of select="count(key('id', //ref/@ref-id)/graphic)"/> 
    </xsl:template> 
</xsl:transform> 

см http://xsltransform.net/ej9EGc1

+0

Благодарим вас за ответ. К сожалению, я не могу использовать xsl – Valeriane

+1

. Затем подумайте об удалении тега xslt. –

1

Вы конкретно упоминается кислороду, так вот один вариант:

for $refid in @ref-id return count(//figure[graphic/@id = $refid]/graphic) 

Это XPath 2.0 нужно будет использовать в XPath панели (убедитесь, что у вас есть XPath 2.0 выбран). Я не думаю, что вы можете использовать построитель XPath, потому что теряете свой контекст.

Единственный раз, когда я смогу заставить это работать правильно 100% времени, чтобы убедиться, что когда я нажал на элемент ref, присутствовали 2 скобки под начало и конец элемента (после нажатия на XPath Панель инструментов для запуска XPath). Это гарантирует правильность контекста. (Это можно сделать, щелкнув непосредственно после <ref.)

Скобки выделены на скриншоте ниже. Также обратите внимание на правильные результаты в нижней части экрана:

enter image description here

Update: Добавление ancestor-or-self::*[1], кажется, помогает с не получить правильный контекст, независимо от того, где в элементе вы щелкаете:

for $refid in ancestor-or-self::*[1]/@ref-id return count(//figure[graphic/@id = $refid]/graphic) 
Смежные вопросы