Xslt用于内部XML节点 [英] Xslt for inner XML nodes

查看:84
本文介绍了Xslt用于内部XML节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有源XML,看起来像



I have a source XML and that looks like

<?xml version="1.0" encoding="UTF-8" ?>
<HOST_LIST_VM_DETECTION_OUTPUT>
  <RESPONSE>
    <DATETIME>2017-05-05T08:52:51Z</DATETIME>
    <HOST_LIST>
    <HOST>
        <IP>10.132.195.26</IP>
        <DETECTION_LIST>
          <DETECTION>
            <QID>38255</QID>
          </DETECTION>
          <DETECTION>
            <QID>70001</QID>
          </DETECTION>
		  </DETECTION_LIST>
		  </HOST>
	<HOST>
        <IP>172.18.4.79</IP>
        <DETECTION_LIST>
          <DETECTION>
            <QID>19626</QID>
          </DETECTION>
          <DETECTION>
            <QID>19627</QID>
          </DETECTION>
		  </DETECTION_LIST>
		  </HOST>
		      </HOST_LIST>
  </RESPONSE>
</HOST_LIST_VM_DETECTION_OUTPUT>





我想要这样的结果出售





I want a resultant out put like this

<Records>
<record>
<qid>38255</qid>
<ip>10.132.195.26</ip>
</record>
<record>
<qid>70001</qid>
<ip>10.132.195.26</ip>
</record>
<record>
<qid>19626</qid>
<ip>172.18.4.79</ip>
</record>
<record>
<qid>19627</qid>
<ip>172.18.4.79</ip>
</record>
</Records>





我的尝试:



我一直试图自定义的XSLT看起来像这样





What I have tried:

The XSLT that I have been trying to customize looks like this

<?xml version = "1.0" encoding = "UTF-8"?> 
<xsl:stylesheet version = "1.0" 
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">   
   
<xsl:template match="/">
<xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST"/>
</xsl:template>
<xsl:template match="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST">
<xsl:value-of select="IP"/>
<xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION"/>
</xsl:temaplte>
<xsl:template match="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION">
<xsl:for-each select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION">
<xsl:value-of select="QID"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>





但是我无法进入< detection_list>



But i am not able to get inside <detection_list>

推荐答案

选择查询传递给 apply-templates for-each 相对于当前节点。



您已经在 HOST_LIST_VM_DETECTION_OUTPUT / RESPONSE / HOST_LIST / HOST ,所以你的 apply-templates 查询正在寻找:

The select query passed to apply-templates and for-each is relative to the current node.

You are already in HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST, so your apply-templates query is looking for:
HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION



和你的 for-each 模板正在寻找:


and your for-each template is looking for:

HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION





您还需要包含所需的元素您的输出。



将模板更改为:



You also need to include the elements that you want in your output.

Change your template to:

<?xml version = "1.0" encoding = "UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   
    <xsl:template match="/">
        <Records>
            <xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST"/>
        </Records>
    </xsl:template>
    
    <xsl:template match="HOST">
        <xsl:variable name="IP" select="IP" />
        <xsl:for-each select="DETECTION_LIST/DETECTION">
            <record>
                <qid><xsl:value-of select="QID"/></qid>
                <ip><xsl:value-of select="


IP / > < < span class =code-leadattribute> / ip >
< / record >
< / xsl:for-each >
< / xsl:template >
< / xsl:stylesheet > ;
IP"/></ip> </record> </xsl:for-each> </xsl:template> </xsl:stylesheet>


尝试替换

try to replace
</xsl:temaplte>



with


with

</xsl:template>


这篇关于Xslt用于内部XML节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆