【问题标题】:xpath expression to select specific xml nodes that are available in a file用于选择文件中可用的特定 xml 节点的 xpath 表达式
【发布时间】:2026-02-21 08:55:02
【问题描述】:

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

如何编写 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>

【问题讨论】:

    标签: xslt-2.0


    【解决方案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>
    

    【讨论】:

      最近更新 更多