结合XML节点和XSL

结合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

我有一个API,我目前正在使用SOAP调用,它正在输出一个XML文件。我遇到的麻烦是把文件放在一个表中以便阅读。最大的问题是asset.device和相应的asset.os没有包装在任何东西中

输出大致如下:

<?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不客气。请注意:
后面的同级
是一个轴,而不是一个属性。术语很重要。