2016-09-06 2 views
1

Я пытался найти способ для моей странной проблемы.xpath выражение для выбора определенных узлов xml, доступных в файле

Как написать xpath для выбора определенных узлов xml, доступных в другом текстовом файле.

Например,

<xsl:for-each select="SUBSCRIBER_PROFILE_LIST/SUBSCRIBER_PROFILE_INFO[GROUP_NAME eq (group name list in a text file as input)]"> 

Например,

<xsl:for-each select="SUBSCRIBER_PROFILE_LIST/SUBSCRIBER_PROFILE_INFO[GROUP_NAME eq collection('select_nodes.txt')]"> 

select_nodes.txt contains list of string that can be selected only 
For example 
ABC 
IJK 


<SUBSCRIBER> 
    <MSISDN>123456</MSISDN> 
    <SUBSCRIBER_PROFILE_LIST> 
     <SUBSCRIBER_PROFILE_INFO> 
      <PROFILE_MSISDN>12345</PROFILE_MSISDN> 
      <GROUP_NAME>ABC</GROUP_NAME> 
      <GROUP_ID>18</GROUP_ID> 
     </SUBSCRIBER_PROFILE_INFO> 
     <SUBSCRIBER_PROFILE_INFO> 
      <PROFILE_MSISDN>456778</PROFILE_MSISDN> 
      <GROUP_NAME>DEF</GROUP_NAME> 
      <GROUP_ID>100</GROUP_ID> 
     </SUBSCRIBER_PROFILE_INFO> 
     <SUBSCRIBER_PROFILE_INFO> 
      <PROFILE_MSISDN>78876</PROFILE_MSISDN> 
      <GROUP_NAME>IJK</GROUP_NAME> 
      <GROUP_ID>3</GROUP_ID> 
     </SUBSCRIBER_PROFILE_INFO> 
</SUBSCRIBER> 

ответ

1

XSLT2 имеет ограниченные функциональные возможности для анализа произвольных текстовых файлов. Я хотел бы предложить:

  1. Сделать select_nodes.txt файл XML и загрузить его с помощью doc() функции:

    <xsl:variable name="group_names" as="xs:string *" 
        select="doc('select_nodes.xml')/groups/group"/> 
    

    с select_nodes.xml глядя, как это:

    <?xml version="1.0" encoding="UTF-8"?> 
    <groups> 
        <group>ABC</group> 
        <group>IJK</group> 
    </groups> 
    
  2. Передайте имена групп как параметр таблицы стилей. (Как вы это делаете, зависит от того, какой движок XSLT вы используете, и через командную строку или API.) Если это через API, то вы можете передать значения непосредственно как объекты с нулевым именем: xs:string. В противном случае вам придется разобрать параметр:

    <xsl:param name="group_names_param"/> 
    
    <!-- Assuming the input string is a whitespace-separated list of names --> 
    <xsl:variable name="group_names" as="xs:string *" 
        select="tokenize($group_names_param, '\s+')"/> 
    

В любом случае ваш обмен на каждое выражение будет выглядеть следующим образом:

<xsl:for-each select=" 
    SUBSCRIBER_PROFILE_LIST/SUBSCRIBER_PROFILE_INFO[GROUP_NAME = $group_names]"> 
    <!-- Do something --> 
</xsl:for-each> 
+0

удивительным. Спасибо в тон ... – Hari

Смежные вопросы