我有一个XML文件:
<?xml version="1.0" encoding="windows-1250"?>
<CONTACTS>
<CONTACT>
<FirstName>AfgZohal</FirstName>
<LastName>Zohal Afg</LastName>
</CONTACT>
<CONTACT>
<FirstName>Arun_niit</FirstName>
<LastName>Arun_niit</LastName>
<EMail>nura_ice@yahoo.co.in</EMail>
</CONTACT>
<CONTACT>
<FirstName>Bống MũnHải</FirstName>
<LastName>Hải Anh Bống Mũn</LastName>
<URL>http://www.facebook.com/profile.php?id=100000689849077</URL>
</CONTACT>
</CONTACTS>
我想在我的xml文件中的FirstName之前添加一个元素ID;如果URL可用,我想从URL标记中提取ID,或者我想从电子邮件地址中提取前六个字母以将其放入ID中(唯一) )。因为在某些联系人中,没有URL。我使用XSLT。 在我的XSl文件中,我试过这种方式
<ID>
<xsl:value-of select="CONTACT/URL[//http='@id']"/>
</ID>
但它不起作用,这是我的XSL文件:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="CONTACT">
<xsl:copy>
<ID>
<xsl:value-of select="CONTACT/URL[//http='@id']"/>
</ID>
<xsl:copy-of select="FirstName|LastName|URL"/>
<EMAILS>
<xsl:apply-templates select="EMail"/>
</EMAILS>
</xsl:copy>
</xsl:template>
<xsl:template match="EMail">
<EMail>
<Type><xsl:value-of select="substring-before(
substring-after(.,'@'),
'.')"/>
</Type>
<Value><xsl:value-of select="."/></Value>
</EMail>
</xsl:template>
</xsl:stylesheet>
这是我输出的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<CONTACTS>
<CONTACT>
<ID/>
<FirstName>AfgZohal</FirstName>
<LastName>Zohal Afg</LastName>
<EMAILS/>
</CONTACT>
<CONTACT>
<ID/>
<FirstName>Arun_niit</FirstName>
<LastName>Arun_niit</LastName>
<EMAILS>
<EMail>
<Type>yahoo</Type>
<Value>nura_ice@yahoo.co.in</Value>
</EMail>
</EMAILS>
</CONTACT>
<CONTACT>
<ID/>
<FirstName>Bống MũnHải</FirstName>
<LastName>Hải Anh Bống Mũn</LastName>
<URL>http://www.facebook.com/profile.php?id=100000689849077</URL>
<EMAILS/>
</CONTACT>
<CONTACT>
</CONTACTS>
这是我昨天问题Novice transformation using apply-templates and string manipulation in the child node的一部分;因为这是一个不同的问题,我提出了一个不同的问题。
答案 0 :(得分:3)
您似乎想要在URL
元素中选择url字符串的“id”部分。您应该在?id=
之后选择子字符串:
<ID>
<xsl:value-of select="substring-after(URL,'?id=')"/>
</ID>
此外,在模板中,您处于CONTACT
的上下文中,因此只需指定元素的名称即可选择它的子元素。例如:
<xsl:template match="CONTACT">
<xsl:value-of select="URL"/>
</xsl:template>
将返回URL
的值:
<xsl:template match="CONTACT">
<xsl:value-of select="CONTACT/URL"/>
</xsl:template>
不会返回任何内容,不会CONTACT
任何类型为CONTACT/URL
的孩子。
评论问题的答案:
如果网址可用,我想从网址标记中提取ID,或者我想从电子邮件地址中提取前六个字母以将其放入ID(唯一)(...)如果我们有一个/多个电子邮件地址,然后我们可以从电子邮件地址中选择前六个字母中的任何一个。我认为,如果没有网址,联系人必须至少有一个电子邮件地址...
<ID>
<xsl:choose>
<xsl:when test="URL">
<xsl:value-of select="substring-after(URL,'?id=')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before(EMail[1],'@')"/>
</xsl:otherwise>
</xsl:choose>
</ID>