2016-09-06 85 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