在XML中添加元素。 (XSLT)

时间:2016-01-20 10:50:48

标签: xml xslt

我无法正确格式化XML格式。我从mySQL数据库中提取数据并返回数据。

<Customers>
<Customer Telephone="#" Country="#" Postcode="#" County="" Town="#" Address2="#" Address1="#" Surname="#" Forename="#" Suffix="#" Middlename="#" Title="#" Id="#"/>
</Customers>

我需要这些属性作为元素,快速搜索相当容易,使用XLST下面的文件。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Company>
<xsl:apply-templates/>
</Company>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
</xsl:template>
</xsl:stylesheet>

我最终得到了数据。

<Company>
<Customers>
<Customer><Id>#</Id><Title>#</Title><Middlename>#</Middlename><Suffix>#</Suffix><Forename>#</Forename><Surname>#</Surname><Address1>#</Address1><Address2>#</Address2><Town>#</Town><County>#</County><Postcode>#</Postcode><Country>#</Country><Telephone>#</Telephone>
</Customer>
</Customers>
</Company>

但是我需要添加&#39;&lt;地址&gt; &LT; /地址&gt;&#39;使用XSLT的(Address1和Address2)元素,但真的很难如何做到这一点。几乎所有我尝试的都会导致错误。

先谢谢了,

3 个答案:

答案 0 :(得分:3)

您是否认为在XSLT样式表中有两次相同的模板?

在处理talk元素的位置干预身份模板。在其中插入新元素Customer,仅将模板应用于名称中包含“地址”的属性:

Adresses

然后才将模板应用于<Adresses> <xsl:apply-templates select="@*[contains(name(),'Address')]"/> </Adresses> 的剩余内容:

Customer

XSLT样式表

<xsl:apply-templates select="@*[not(contains(name(),'Address'))]|node()"/>

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" indent="yes"/>

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

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Customer">
        <xsl:copy>
            <Adresses>
                <xsl:apply-templates select="@*[contains(name(),'Address')]"/>
            </Adresses>
            <xsl:apply-templates select="@*[not(contains(name(),'Address'))]|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Customer/@*">
        <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
    </xsl:template>

</xsl:stylesheet>

请注意,XML中的属性顺序并不重要。 XML解析器以其喜欢的任何顺序提供元素的属性。在您的情况下,这意味着输出中<?xml version="1.0" encoding="UTF-8"?> <Company> <Customers> <Customer> <Adresses> <Address2>#</Address2> <Address1>#</Address1> </Adresses> <Telephone>#</Telephone> <Country>#</Country> <Postcode>#</Postcode> <County/> <Town>#</Town> <Surname>#</Surname> <Forename>#</Forename> <Suffix>#</Suffix> <Middlename>#</Middlename> <Title>#</Title> <Id>#</Id> </Customer> </Customers> </Company> 的子元素的顺序将是任意的。

在线试用此解决方案here

答案 1 :(得分:1)

使用

<xsl:template match="Customer/@Address1">
  <Addresses>
    <Address1>
      <xsl:value-of select="."/>
    </Address1>
    <Address2>
      <xsl:value-of select="../@Address2"/>
    </Address2>
  </Addresses>
</xsl:template>

<xsl:template match="Customer/@Address2"/>

答案 2 :(得分:0)

首先,您现有的样式表有相互冲突的模板:您有不少于3个与@*匹配的模板。

我建议你更具体一点(并且更短):

XSLT 1.0

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

<xsl:template match="/Customers">
    <Company>
        <xsl:apply-templates/>
    </Company>
</xsl:template>

<xsl:template match="Customer">
    <xsl:copy>
        <xsl:apply-templates select="@*[not(starts-with(name(), 'Address'))]"/>
        <Addresses>
            <xsl:apply-templates select="@*[starts-with(name(), 'Address')]"/>
        </Addresses>
    </xsl:copy>
</xsl:template>

<xsl:template match="@*">
    <xsl:element name="{name()}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>