Camel 如何在XSLT中显示父节点

lawou6xi  于 2023-03-02  发布在  Apache
关注(0)|答案(1)|浏览(99)

我尝试在XSLT中将Json输入转换为XML,但是在进行转换时,我只得到了没有任何父节点的子节点,即“Client”、“ClientApp”、“Payment”和“Bill”节点,它们没有显示在XML输出中,知道模板中缺少了什么才能显示这些节点吗?
模板

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xj="http://camel.apache.org/component/xj"
            exclude-result-prefixes="xj">

<xsl:output omit-xml-declaration="no" encoding="UTF-8" method="xml" indent="yes"/>

<xsl:template match="/">
        <xsl:apply-templates select="//object"/>
</xsl:template>

<xsl:template match="object[@xj:type != 'object' and @xj:type != 'array' and string-length(@xj:name) > 0]">
    <xsl:variable name="name" select="@xj:name"/>
    <xsl:element name="{$name}">
        <xsl:value-of select="text()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*|node()"/>
</xsl:stylesheet>

约松

{
 "Client": {
     "Date": "2022-12-29T09:55:05",
     "Lang": "es-CO",
     "ClientApp": {
         "Org": "COMPANY",
         "Name": "NAME COMPANY",
         "Version": 1
  }
 },
"Payment": {
    "PaymentId": "00000000-0000-0000-0000-943534532",
    "Bill": {
        "PaymentId": "00000000-0000-0000-0000-943534532",
        "PaymeentNumber": 63703,
        "BillId": "00000000-0000-0000-0000-003223439138"
  }
 }
}

输出XML

<?xml version="1.0" encoding="UTF-8"?>
<Date>2022-12-29T09:55:05</Date>
<Lang>es-CO</Lang>
<Org>COMPANY</Org>
<Name>NAME COMPANY</Name>
<Version>1</Version>
<PaymentId>00000000-0000-0000-0000-943534532</PaymentId>
<PaymentId>00000000-0000-0000-0000-943534532</PaymentId>
<PaymeentNumber>63703</PaymeentNumber>
<BillId>00000000-0000-0000-0000-003223439138</BillId>

XML输入

<?xml version="1.0" encoding="UTF-8"?>
<object
xmlns:xj="http://camel.apache.org/component/xj" xj:type="object">
<object xj:name="Client" xj:type="object">
    <object xj:name="Date" xj:type="string">2022-12-29T09:55:05</object>
    <object xj:name="Lang" xj:type="string">es-CO</object>
    <object xj:name="ClientApp" xj:type="object">
        <object xj:name="Org" xj:type="string">COMPANY</object>
        <object xj:name="Name" xj:type="string">NAME COMPANY</object>
        <object xj:name="Version" xj:type="int">1</object>
    </object>
</object>
<object xj:name="Payment" xj:type="object">
    <object xj:name="PaymentId" xj:type="string">00000000-0000-0000-0000-943534532</object>
    <object xj:name="Bill" xj:type="object">
        <object xj:name="PaymentId" xj:type="string">00000000-0000-0000-0000-943534532</object>
        <object xj:name="PaymeentNumber" xj:type="int">63703</object>
        <object xj:name="BillId" xj:type="string">00000000-0000-0000-0000-003223439138</object>
    </object>
</object>
omtl5h9j

omtl5h9j1#

样式表通过@xj:type != 'object' predicate 排除父元素。此外,您的方法:

<xsl:apply-templates select="//object"/>

将展平结果。如果要保留原始层次结构,请尝试类似以下操作:

XSLT 1.0版本

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xj="http://camel.apache.org/component/xj"
exclude-result-prefixes="xj">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/object">
    <root>
        <xsl:apply-templates/>
    </root>
</xsl:template>

<xsl:template match="object">
    <xsl:choose>
        <xsl:when test="@xj:name">
            <xsl:element name="{@xj:name}">
                <xsl:apply-templates/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

相关问题