我有这个XML:
<org.mule.module.json.JsonData>
<node class="org.codehaus.jackson.node.ObjectNode">
<__nodeFactory/>
<__children>
<entry>
<string>freshdesk_webhook</string>
<org.codehaus.jackson.node.ObjectNode>
<__nodeFactory reference="../../../../__nodeFactory"/>
<__children>
<entry>
<string>ticket_id</string>
<org.codehaus.jackson.node.IntNode>
<__value>7097</__value>
</org.codehaus.jackson.node.IntNode>
</entry>
<entry>
<string>ticket_requester_email</string>
<org.codehaus.jackson.node.TextNode>
<__value>walter@white.com</__value>
</org.codehaus.jackson.node.TextNode>
</entry>
</__children>
</org.codehaus.jackson.node.ObjectNode>
</entry>
</__children>
</node>
</org.mule.module.json.JsonData>
我需要使用XSLT将其转换为:
<root>
<entry>
<name>freshdesk_webhook</name>
<value>
<entry>
<name>ticket_id</name>
<value>7097</value>
</entry>
<entry>
<name>ticket_requester_email</name>
<value>walter@white.com</value>
</entry>
</value>
</entry>
</root>
我相信转型很容易。但是我今天测试了许多XSLT并且还没有结果。如何使用递归XSLT将我繁重的XML转换为简单的XML?
请帮忙。
答案 0 :(得分:3)
这是相当简单的,因为如果没有特定节点的明确匹配,XSLT的built in template rules元素只会继续处理子节点,而文本节点的默认规则只是输出文本。因此映射变为
root
entry
- &gt; entry
name
value
而其他一切只使用默认的“与孩子同行”规则
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*" />
<xsl:output indent="yes" />
<xsl:template match="/*">
<root><xsl:apply-templates /></root>
</xsl:template>
<xsl:template match="entry">
<entry><xsl:apply-templates /></entry>
</xsl:template>
<xsl:template match="entry/*[1]">
<name><xsl:apply-templates /></name>
</xsl:template>
<xsl:template match="entry/*[2]">
<value><xsl:apply-templates /></value>
</xsl:template>
</xsl:stylesheet>
xsl:strip-space
很重要,因为它会导致样式表忽略输入XML中的所有缩进(仅限空格的文本节点),并且只关注元素和重要文本({{{{1}的内容。 1}}和string
元素。)