针对给定输入和输出的XSL创建

时间:2017-09-27 12:52:08

标签: xml xslt

您好我跟随XML作为我的xsl的输入,是否有任何在线工具也可以这样做。

<?xml version="1.0" encoding="UTF-8"?>
<Parent att1="2012-11-30"
   att2="Y" att3="11404262" att4="1032">
    <Child1 att1="0"/>
    <Child2>
        <Child3 CodeShort="1032" CodeType="NODE" CodeValue="Rohith"/>
        <Child3 CodeShort="1032" CodeType="NODE" CodeValue="Sachin"/>
        <Child3 CodeShort="1032" CodeType="NODE" CodeValue="Rahul"/>
    </Child2>
</Parent>

我需要遍历child3次并且只复制那么多次的Parent标签,并且每次我的外观看起来都会用Child3 CodeValue替换父级的att4,在转换xml时遇到问题

<?xml version="1.0" encoding="UTF-8"?>
<multiApi>
    <Parent att1="2012-11-30" att2="Y" att3="11404262" att4="Rohith" ></Parent>
    <Parent att1="2012-11-30" att2="Y" att3="11404262" att4="Sachin" ></Parent>
    <Parent att1="2012-11-30" att2="Y" att3="11404262" att4="Rahul" ></Parent>
</multiApi>

请告诉我们我需要使用的xsl,如果有任何在线工具可以帮助我。

我需要迭代child3次并且只复制很多次的Parent标记,并且每次都用Child3 CodeValue替换parent的att4

编辑:我们尝试无法通过具体解决方案获得的xsl

<xsl:stylesheet xmlns:xsl="w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" />
    <xsl:template match="/">
        <mutiApi>
            <xsl:for-each select="parent/child2/child3">
                <xsl:copy-of select="/parent" />
                <xsl:attribute name="Node">
                    <xsl:value-of select="./@CodeValue" />
                </xsl:attribute>
            </xsl:for-each>
        </mutiApi>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

您可以创建<Parent>节点并迭代它的属性,而不是尝试复制<Parent>节点及其属性。对于属性att4,您可以有条件地检查它的名称,并将该值替换为@CodeValue的值。

以下是可以帮助提供所需输出的XSLT。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="Child2">
        <multiApi>
            <xsl:for-each select="Child3">
                <xsl:variable name="codeVal" select="@CodeValue" />
                <Parent>
                    <xsl:for-each select="/Parent/@*">
                        <xsl:attribute name="{local-name(.)}">
                            <xsl:choose>
                                <xsl:when test="local-name(.) = 'att4'">
                                    <xsl:value-of select="$codeVal" />
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="." />
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:attribute>
                    </xsl:for-each>
                </Parent>
            </xsl:for-each>
        </multiApi>
    </xsl:template>
</xsl:stylesheet>

输出

<multiApi>
    <Parent att1="2012-11-30" att2="Y" att3="11404262" att4="Rohith" />
    <Parent att1="2012-11-30" att2="Y" att3="11404262" att4="Sachin" />
    <Parent att1="2012-11-30" att2="Y" att3="11404262" att4="Rahul" />
</multiApi>