文件中可用的 select 个特定 xml 个节点的 xpath 表达式

xpath expression to select specific xml nodes that are available in a file

我正试图找到解决我的奇怪问题的方法。

如何将 xpath 写入另一个文本文件中可用的 select 特定 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>

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>