0

我有这个 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?

请帮忙。

4

1 回答 1

3

这相当简单,因为 XSLT为元素内置的模板规则只是在没有明确匹配特定节点的情况下继续处理子节点,而文本节点的默认规则只是输出文本。所以映射变成

  • 顶级文档元素 ->root
  • entry->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 中的所有缩进(仅限空格的文本节点)并只关注元素和重要文本(string__value元素的内容)。

于 2013-10-31T13:15:55.543 回答