Xslt用于内部XML节点 [英] Xslt for inner XML nodes
本文介绍了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
查询正在寻找:
Theselect
query passed toapply-templates
andfor-each
is relative to the current node.
You are already inHOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST
, so yourapply-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屋!
查看全文