在XML标记内插入元素列表

时间:2016-12-18 22:49:49

标签: xslt

我正在尝试获取所有元素的列表,这些元素的值不在(第1行,第2行)中,然后将它们插入到与测试类似的标记中。

现在我可以检索所有元素,但是我无法将其限制为我想要的值。然后,我不确定如何匹配并为匹配标准之外的元素执行每个操作。任何建议将不胜感激!

鉴于以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
    <Header>
        <Line1>Element1</Line1>
        <Line2>Element2</Line2>
    </Header>
    <ElementControl>
        <Update>
            <Element>test</Element>
        </Update>
    </ElementControl>
    <Member>
        <Identifier>123456789</Identifier>
        <Contact>
            <Person>
                <Gender>MALE</Gender>
                <Title>Mr</Title>
                <Name>JOHN DOE</Name>
            </Person>
            <HomePhone/>
            <eMailAddress/>
            <ContactAddresses>
                <Address>
                    <AddressType>POS</AddressType>
                    <Line1>100 Fake Street</Line1>
                    <Line2/>
                    <Line3/>
                    <Line4/>
                    <Suburb>Jupiter</Suburb>
                    <State>OTH</State>
                    <PostCode>9999</PostCode>
                    <Country>AUS</Country>
                </Address>
            </ContactAddresses>
        </Contact>
    </Member>
</Request>

获取元素的当前XSL

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>      
        <xsl:template match="node()">
        <xsl:for-each select="node()[text() != '']">
            <xsl:value-of select="local-name()"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
        <xsl:apply-templates select="node()"/>
    </xsl:template>

</xsl:stylesheet>

我的WIP xml用于插入结果xml标签,如下所示。我不确定如何将上述xsl的结果插入到此

<xsl:template match="Element">
    <xsl:copy-of select="."/>
    <Element>Value1</Element>
</xsl:template>

最终期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
    <Header>
        <Line1>Element1</Line1>
        <Line2>Element2</Line2>
    </Header>
    <ElementControl>
        <Update>
            <Element>Identifier</Element>
            <Element>Gender</Element>
            <Element>Title</Element>
            <Element>Name</Element>
            <Element>AddressType</Element>
            <Element>Line1</Element>
            <Element>Suburb</Element>
            <Element>State</Element>
            <Element>PostCode</Element>
            <Element>Country</Element>
        </Update>
    </ElementControl>
    <Member>
        <Identifier>123456789</Identifier>
        <Contact>
            <Person>
                <Gender>MALE</Gender>
                <Title>Mr</Title>
                <Name>JOHN DOE</Name>
            </Person>
            <HomePhone/>
            <eMailAddress/>
            <ContactAddresses>
                <Address>
                    <AddressType>POS</AddressType>
                    <Line1>100 Fake Street</Line1>
                    <Line2/>
                    <Line3/>
                    <Line4/>
                    <Suburb>Jupiter</Suburb>
                    <State>OTH</State>
                    <PostCode>9999</PostCode>
                    <Country>AUS</Country>
                </Address>
            </ContactAddresses>
        </Contact>
    </Member>
</Request>

1 个答案:

答案 0 :(得分:0)

我会将当前模板更改为使用0.000004属性,因此它仅用于特定情况,而不是匹配所有元素。您还应该将其更改为输出元素,而不是文本,如下所示:

mode

然后你就可以这样称呼....

<xsl:template match="node()" mode="copy">
    <xsl:for-each select=".//node()[text() != '']">
        <Element>
            <xsl:value-of select="local-name()"/>
        </Element>
    </xsl:for-each>
</xsl:template>

试试这个XSLT。请注意使用标识模板来复制所有其他现有元素

    <xsl:template match="ElementControl/Update">
        <xsl:apply-templates select="../../Member" mode="copy" />
    </xsl:template>