结合XML节点和XSL
我有一个API,我目前正在使用SOAP调用,它正在输出一个XML文件。我遇到的麻烦是把文件放在一个表中以便阅读。最大的问题是asset.device和相应的asset.os没有包装在任何东西中 输出大致如下:结合XML节点和XSL,xml,xslt,Xml,Xslt,我有一个API,我目前正在使用SOAP调用,它正在输出一个XML文件。我遇到的麻烦是把文件放在一个表中以便阅读。最大的问题是asset.device和相应的asset.os没有包装在任何东西中 输出大致如下: <?xml version="1.0" encoding="UTF-8"?> <DeviceAssetInfoExport> <asset.device> <asset.device.id>123</asset.device
<?xml version="1.0" encoding="UTF-8"?>
<DeviceAssetInfoExport>
<asset.device>
<asset.device.id>123</asset.device.id>
...
</asset.device>
<asset.os>
<asset.os.reportedos>abc</asset.os.reportedos>
...
<asset.os>
<asset.device>
<asset.device.id>321</asset.device.id>
...
</asset.device>
<asset.os>
<asset.os.reportedos>cba</asset.os.reportedos>
...
<asset.os>
</DeviceAssetInfoExport>
123
...
abc
...
321
...
中国篮球协会
...
所需的输出是一个html表,如:
<html>
<body>
<h2>Servers</h2>
<table>
<tr>
<th>Name</th>
<th>Address</th>
<th>OS</th>
</tr>
<tr>
<td>123</td>
<td>home.co</td>
<td>abc</td>
</tr>
</table>
</body>
</html>
服务器
名称
地址
操作系统
123
home.co
abc
我目前的尝试如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" >
<xsl:template match="DeviceAssetInfoExport">
<h2>Servers</h2>
<table border="1">
<tr bgcolor="gray">
<th>Name</th>
<th>Address</th>
<th>OS</th>
</tr>
<xsl:apply-templates select="asset.device | asset.os"/>
</table>
</xsl:template>
<xsl:template match="asset.device | asset.os">
<tr>
<td><xsl:value-of select="asset.device.longname"/></td>
<td><xsl:value-of select="asset.device.uri"/></td>
<td><xsl:value-of select="asset.os.reportedos"/> - <xsl:value-of select="asset.os.osarchitecture"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
服务器
名称
地址
操作系统
-
不幸的是,我从中收到的输出将asset.os.reportedos信息放在表中自己的行中。它位于正确的第三个位置,只是不在设备信息的正确行上
如果有什么我可以做,使我的期望结果更清楚,请让我知道
谢谢大家! 看看这是否能让你开始: 输入XML
<DeviceAssetInfoExport>
<asset.device>
<asset.device.id>123</asset.device.id>
</asset.device>
<asset.os>
<asset.os.reportedos>abc</asset.os.reportedos>
</asset.os>
<asset.device>
<asset.device.id>456</asset.device.id>
</asset.device>
<asset.os>
<asset.os.reportedos>def</asset.os.reportedos>
</asset.os>
</DeviceAssetInfoExport>
123
abc
456
def
XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/DeviceAssetInfoExport">
<html>
<body>
<h2>Servers</h2>
<table border="1">
<tr>
<th>ID</th>
<th>OS</th>
</tr>
<xsl:apply-templates select="asset.device"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="asset.device">
<tr>
<td><xsl:value-of select="asset.device.id"/></td>
<td><xsl:value-of select="following-sibling::asset.os[1]/asset.os.reportedos"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
服务器
身份证件
操作系统
结果
<html>
<body>
<h2>Servers</h2>
<table border="1">
<tr>
<th>ID</th>
<th>OS</th>
</tr>
<tr>
<td>123</td>
<td>abc</td>
</tr>
<tr>
<td>456</td>
<td>def</td>
</tr>
</table>
</body>
</html>
服务器
身份证件
操作系统
123
abc
456
def
我搞不懂你的问题是什么。首先说所需的输出是[一些XML],然后说需要一个HTML表。并且您的输入没有XSLT中引用的节点,例如,asset.device.longname
。为什么不给我们展示一个最小但完整的输入XML示例,以及您希望在XSL转换结束时看到的实际输出。谢谢您的评论!我在最初一期的演讲中被分裂了,我觉得如果我能以一种更有用的格式获得XML,我就能达到我想要的结果,但是直接解决这个问题更有意义。如果仍然不清楚,请告诉我。我怀疑您希望表格显示实际值(当前输出中缺少),而不是它们的标签。如果是这样,请编辑您的输入以显示两个完整的记录,包括可识别的值,并相应地调整您的预期输出。您是正确的,我已进行了建议的编辑。谢谢你,迈克尔,非常感谢你花时间帮助我澄清我想要的目标并解决这个问题。下面的兄弟属性正是我所需要的,我甚至不知道它的存在。@TomMcDonald不客气。请注意:后面的同级
是一个轴,而不是一个属性。术语很重要。