【问题标题】:Mapping an XML Element value to array of elements in target XML将 XML 元素值映射到目标 XML 中的元素数组
【发布时间】:2016-11-23 14:04:48
【问题描述】:

我有一个 XML 文件的要求,例如:

<main>
    <Qnumber>10</Qnumber>
    <Qaddress>hyderabad</Qaddress>
    <Qratio>12:3</Qratio>
    <QGet>Getthevalue</QGet>
</main>

这些值将按以下方式映射到目标架构:

我们有一个名为 1to many(1-infinite) 的标签:

<Additional properties>
    <property>
        <Name></Name>
        <Value></Value>
    </property>
</Additional properties>

现在我必须通过以下方式映射到它:

<Additional properties>
    <property>
        <Name>Qnumber</Name>
        <Value>10</Value>
    </property>
    <property>
        <Name>Qaddress</Name>
        <Value>hyderabad</Value>
    </property>
    <property>
        <Name>Qratio</Name>
        <Value>12:3</Value>
    </property>
    <property>
        <Name>QGet</Name>
        <Value>Getthevalue</Value>
    </property>
</Additional properties>

我必须在 XSLT 中使用这些东西。任何人都可以帮助解决这个特定的概念。 谢谢

【问题讨论】:

    标签: xslt xslt-2.0 soa xslt-grouping oracle-soa


    【解决方案1】:

    首先,您的 XML 元素名称中不能有空格。因此,我已将空格替换为 _

    这是一个解决方案:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" />
    
        <xsl:template match="main">
            <Additional_properties>
                <xsl:for-each select="./*">
                    <xsl:if test="position() &lt; 5">
                        <property>
                            <xsl:element name="Name">
                                <xsl:value-of select="name()"/>
                            </xsl:element>
                            <xsl:element name="Value">
                                <xsl:value-of select="text()"/>
                            </xsl:element> 
                        </property>
                    </xsl:if>
                </xsl:for-each> 
            </Additional_properties>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 谢谢,如果要考虑所有值,这将起作用,现在问题是我在 xml 中还有 5 个标签,例如
      10hyderabad 12:3Getthevalue1.01234561234
      所以我只希望前 4 个值出现在附加属性中。你能帮我解决这个问题吗?
    • 您可以使用xsl:if检查值
    • 你能详细说明一下吗
    • 我已经更新了我的答案。基本上,您测试循环中的当前节点是否符合条件。这将只处理前 4 个节点。但是,如果您想指定节点的名称,则可以检查它们的名称,而不是它们的位置,并在测试表达式中使用“或”。
    • 非常感谢你的回答,如果我没有指定的顺序,比如不同位置的标签,你能告诉我
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2015-08-21
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多