我无法正确格式化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)元素,但真的很难如何做到这一点。几乎所有我尝试的都会导致错误。
先谢谢了,
答案 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>