2016-09-06 83 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+')"/> 
    

在這兩種情況下,你的for-each然後表達應該是這樣的:

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

真棒。謝謝噸... – Hari