【问题标题】:Insert list of elements inside XML tags在 XML 标记内插入元素列表
【发布时间】:2017-05-03 23:32:04
【问题描述】:

我正在尝试获取值不在(第 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>

用于插入结果 xml 标签的我的 WIP 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>

【问题讨论】:

    标签: xslt


    【解决方案1】:

    我会将当前模板更改为使用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>
    

    那你可以这样称呼它....

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

    试试这个 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="node()" mode="copy">
            <xsl:for-each select=".//node()[text() != '']">
                <Element>
                    <xsl:value-of select="local-name()"/>
                </Element>
            </xsl:for-each>
        </xsl:template>
    
        <xsl:template match="ElementControl/Update">
            <xsl:apply-templates select="../../Member" mode="copy" />
        </xsl:template>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多