2017-02-17 6 views
1

У меня есть входной файл XML, который выглядит следующим образом:XPath Определить все XML-элементы по значению атрибута не известен до времени выполнения

<property> 
<properties> 
    <entry id="55882d2cacb45"> 
     <location_number>1</location_number> 
     <building_number>1</building_number> 
     <coverage source_id="55882d2cacb45"> 
      <name>building</name> 
      <premium>2880</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>contents</name> 
      <premium>1290</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>business</name> 
      <premium>7780</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>inflationGuard</name> 
      <premium>29</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>terrorism</name> 
      <premium>353</premium> 
     </coverage> 
     <building> 
      <entry id="55882d2cacb45"> 
       <building>1,000,000</building> 
       <coverage_form>Class</coverage_form> 
       <coverage source_id="55882d2cacb45"> 
        <name>building</name> 
        <premium>2880</premium> 
       </coverage> 
       <group2_type>Symbol</group2_type> 
      </entry> 
     </building> 
    </entry> 
</properties> 
<properties> 
    <entry id="55882d2cacc68"> 
     <location_number>1</location_number> 
     <building_number>2</building_number> 
     <coverage source_id="55882d2cacc68"> 
      <name>building</name> 
      <premium>749</premium> 
     </coverage> 
     <coverage source_id="55882d2cacc68"> 
      <name>contents</name> 
      <premium>170</premium> 
     </coverage> 
     <coverage source_id="55882d2cacc68"> 
      <name>business</name> 
      <premium>1095</premium> 
     </coverage> 
     <coverage source_id="55882d2cacc68"> 
      <name>inflationGuard</name> 
      <premium>7</premium> 
     </coverage> 
     <coverage source_id="55882d2cacc68"> 
      <name>terrorism</name> 
      <premium>63</premium> 
     </coverage> 
     <coverage source_id="55882d2cacc68"> 
      <name>theft</name> 
      <premium>266</premium> 
     </coverage> 
     <building> 
      <entry id="55882d2cacc68"> 
       <building>100,000</building> 
       <coverage_form>Class</coverage_form> 
       <coverage source_id="55882d2cacc68"> 
        <name>building</name> 
        <premium>749</premium> 
       </coverage> 
       <group2_type>Symbol</group2_type> 
      </entry> 
     </building> 
     <improvements> 
      <entry id="55882d2cacc68"> 
       <improvements>5,000</improvements> 
       <coverage_form>Class</coverage_form> 
       <coverage source_id="55882d2cacc68"> 
        <name>business</name> 
        <premium>1095</premium> 
       </coverage> 
       <group2_type>Symbol</group2_type> 
      </entry> 
     </improvements> 
    </entry> 
</properties> 
<eb> 
    <eb_total_insured_value>4155000</eb_total_insured_value> 
    <coverage source_id="55882d2cacb45"> 
     <name>eb</name> 
     <premium>2880</premium> 
    </coverage> 
</eb> 
<value_pack> 
    <coverage source_id="55882d2cacb45"> 
     <name>capacity_value_pack</name> 
     <premium>600</premium> 
    </coverage> 
</value_pack> 
<quote> 
    <taxes_fees> 
     <coverage source_id="55882d2cacb45"> 
      <name>mga_fee</name> 
      <premium>25</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>citizens</name> 
      <premium>165.65</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>empa</name> 
      <premium>4</premium> 
     </coverage> 
     <coverage source_id="55882d2cacb45"> 
      <name>fire_surcharge</name> 
      <premium>16.57</premium> 
     </coverage> 
    </taxes_fees> 
</quote> 

Мне нужно найти все элементы, независимо от их названий, что имеют атрибут source_id, который соответствует атрибуту id элемента элемента (см. первый элемент ввода) и обрабатывает их по отдельности. Значение неизвестно до выполнения. Использование ключа, похоже, является частью ответа, но имя элемента кажется жестко закодированным во всех примерах, которые я могу найти. Цените любое понимание!

+0

«* Мне нужно найти все элементы, независимо от имени, которые имеют атрибут source_id, который соответствует идентификатору элемента ввода '(см. первый элемент ввода) и обрабатывать их по отдельности. * «Что именно означает« поиск и обработка »? Каким будет ожидаемый результат в данном примере? –

+1

Если вы знаете о ключах, вы можете использовать '', чтобы определить ключ для всех элементов, имеющих 'source_id' атрибут. Затем из '' вы можете использовать, например. 'key ('source', @id)', чтобы найти все ссылочные элементы или даже в XSLT 2 'key ('source', @id,.)', чтобы найти все ссылочные элементы-потомки записи. –

+0

Спасибо, все за такой быстрый ответ. Я попробую эти 2 решения от Martin и kjhughes в эти выходные. Благодаря micheal.hor257k; в будущем я сформулирую свои вопросы лучше. –

ответ

0

Если вы знаете о ключах, вы можете использовать <xsl:key name="source" match="*[@source_id]" use="@source_id"/>, чтобы определить ключ для всех элементов, имеющих атрибут source_id. Затем от <xsl:template match="entry"> вы можете использовать, например. key('source', @id), чтобы найти все ссылочные элементы или даже в XSLT 2 key('source', @id, .), чтобы найти все ссылочные элементы-потомки записи

1

Это XPath,

//*[@source_id = ancestor::entry/@id] 

будут выбраны все элементы со значением атрибута source_id равным предка entry значения @id атрибута элемента.

+0

Исходный XML имеет элементы, чей 'source_id' равен' id' 'entry', который ** не является ** предком элемента. Лучше использовать ключ. –

+0

Хорошая мысль, Майкл. Чтобы ответить на ваш первый вопрос, мне нужно иметь возможность принимать каждый элемент с id или source_id и сопоставлять определенные элементы с выходом XML, возможно, через for-each. Я новичок в XSLT, но по мере того, как я узнаю, мои вопросы и ответы улучшатся ... –

+0

@ michael.hor257k: О, ну, лучше используйте ключи. Поскольку Мартин Хоннен уже показал [как это сделать с ключами в комментариях] (http://stackoverflow.com/questions/42306881/xpath-identify-all-xml-elements-by-attribute-value-not-known- до-runtime/42307871? noredirect = 1 # comment71770750_42306881), я просто оставлю этот ответ как есть на тот случай, если он будет полезен кому-либо в будущем. – kjhughes