xml - 当特定值匹配时从 xml 中选择值
问题描述
从下面的 XML 中,当 hostName 与使用 XSLT 的传递参数匹配时,我试图获取 clientID 的值。
假设如果主机名是 TSM-Client.toolslab.net 那么我应该得到的 clientID 像 4
<client_details>
<message-body>
<clientProperties>
<e>
<client>
<clientEntity>
<_type_>3</_type_>
<clientGUID>D1247669-8818-45CF-943D-319090CA9F2C</clientGUID>
<clientId>2</clientId>
<clientName>commserve</clientName>
<hostName>COMMSERVE.toolslab.net</hostName>
</clientEntity>
<cvdPort>8400</cvdPort>
<evmgrcPort>8402</evmgrcPort>
</client>
<clientProps>
<clusterType>0</clusterType>
</clientProps>
</e>
<e>
<client>
<clientEntity>
<_type_>3</_type_>
<clientGUID>933007BA-EFCF-4CC2-838C-45B1E21F7200</clientGUID>
<clientId>4</clientId>
<clientName>tsm-client</clientName>
<hostName>TSM-Client.toolslab.net</hostName>
</clientEntity>
<cvdPort>8400</cvdPort>
<evmgrcPort>0</evmgrcPort>
</client>
<clientProps>
<clusterType>0</clusterType>
</clientProps>
</e>
</clientProperties>
</message-body>
</client_details>
我正在使用下面的代码但没有得到结果,我得到的只是空白
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="no" />
<xsl:template match="/">
<xsl:for-each select="//e">
<xsl:choose>
<xsl:when test="string(./hostName) = string($[client])">
<xsl:value-of select="string(./clientId)" disable-output-escaping="no" />
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
解决方案
我建议你这样尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:param name="hostName"/>
<xsl:key name="client" match="clientEntity" use="hostName" />
<xsl:template match="/">
<xsl:value-of select="key('client', $hostName)/clientId"/>
</xsl:template>
</xsl:stylesheet>
然后使用参数调用转换hostName
。
请注意,这假设最多有一个匹配的客户端。否则,您将需要执行以下操作:
<xsl:template match="/">
<xsl:for-each select="key('client', $hostName)">
<xsl:value-of select="clientId"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
推荐阅读
- azure - 什么语法在 Microsoft Azure 机器学习设计器中的“导入数据”模块的 SQL 查询的 where 子句中引用管道参数?
- if-statement - 批处理文件 - IF 语句问题
- mongodb - MongoDB:投影匹配查询对应的所有元素
- node.js - 不能在节点 js 电报机器人中同时使用内联键盘和解析模式?
- sql - 我正在尝试使用 MFC 在列表控件上显示 SQL 结果
- c++ - 创建放置在错误线程中的新对象
- kivy - Kivy 字体上下文错误
- c++ - boost::split 仅当 C++ 中存在分隔符时才进行拆分
- ios - 有没有办法按宽高比过滤 iOS Shortcuts 照片?
- powershell - 为每个查询的系统添加分隔符?自定义对象