XSLT查询以删除返回的XML中的不需要的元素

时间:2014-08-15 16:49:12

标签: html xml xslt scripting

我有一个修改过的XSLT查询,它会返回我想要的所有内容但是有一个我不想要的附加元素。我如何修改它以摆脱<identifier type="nt">80df0b42de8f31ac4cb7a30d325ff0c1</identifier>行。 xml是:

    <?xml version="1.0" encoding="UTF-8"?>
<CMDBTopology>
<Objects>
<CMDBSet>
<name>80df0b42de8f31ac4cb7a30d325ff0c1</name>
<CMDBObject>
<identifier type="nt">80df0b42de8f31ac4cb7a30d325ff0c1</identifier>
<Properties>
<root_class type="STRING">nt</root_class>
<host_servertype type="STRING"></host_servertype>
<host_osrelease type="STRING"></host_osrelease>
<display_label type="STRING">pharsm-s3004</display_label>
<host_osinstalltype type="STRING"></host_osinstalltype>
</Properties>
</CMDBObject>

我目前的xlst查询是“

        <html>

          <head>

                    <title> title </title>

          </head>

          <body>

                    <xsl:apply-templates />

          </body>

        </html>

        <table width="1" border="1" >

                                            <tr>

    <td> <xsl:value-of select="display_label" /> </td>      
    <td> <xsl:value-of select="root_class" /> </td>


                                <td> <xsl:value-of select="resolver_group" /> </td>

                                <td> <xsl:value-of select="supported_by" /> </td>

                                <td> <xsl:value-of select="environment" /> </td>

                                <td> <xsl:value-of select="site_code" /> </td>

                                <td> <xsl:value-of select="sla_classification" /> </td>

                                <td> <xsl:value-of select="datacenter" /> </td>

                                </tr>

        </table>

`

1 个答案:

答案 0 :(得分:1)

很难给出准确的答案,不知道您希望输出看起来是什么样的,但您的主要问题是您的XSLT中有一个匹配CMDBRelation的模板,就像这样。 ..

<xsl:template match="CMDBRelation" >

但是XML中没有这样的CMDBRelation元素!这意味着永远不会调用此模板。这意味着,当您在第一个模板中执行<xsl:apply-templates />时,XSLT&#34;内置模板&#34;正在使用。这些有效地迭代XML中的所有节点,输出他们找到它们的文本节点,这就是为什么你得到所有文本打印输出而没有表格格式化。

我怀疑您的模板实际上需要匹配CMDBSet

<xsl:template match="CMDBRelation" >

您似乎也在To语句中引用了Fromxsl:for-each元素,而且与以前一样,这些元素并不存在于您的XML中。

<xsl:for-each select="To/CMDBObject/Properties">

您可能需要将两个语句合并为一个,例如

<xsl:for-each select="CMDBObject/Properties">

这是一些修改后的XSLT,它可以生成一个表,并且不会输出任何identifier元素。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <html>
         <head>
            <title> title </title>
         </head>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="CMDBSet">
      <table width="1" border="1">
         <xsl:for-each select="CMDBObject/Properties">
            <tr>
               <td><xsl:value-of select="display_label"/></td>
               <td><xsl:value-of select="root_class"/></td>
               <td><xsl:value-of select="host_servertype"/></td>
               <td><xsl:value-of select="host_osrelease"/></td>
               <td><xsl:value-of select="host_osinstall"/></td>
            </tr>
         </xsl:for-each>
      </table>
   </xsl:template>
</xsl:stylesheet>