文件中可用的 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 解析任意文本文件的功能有限。我会建议:
将 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>
将组名称作为样式表参数传递。 (如何执行此操作取决于您使用的 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>
我正试图找到解决我的奇怪问题的方法。
如何将 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 解析任意文本文件的功能有限。我会建议:
将
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>
将组名称作为样式表参数传递。 (如何执行此操作取决于您使用的 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>