Как проверить существование элемента и выбрать подстроку значения элемента - PullRequest
2 голосов
/ 19 июня 2011

У меня есть 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&#xc5;©nHá&#xba;&#xa3;i</FirstName>
        <LastName>Há&#xba;&#xa3;i Anh Bống M&#xc5;©n</LastName>
        <URL>http://www.facebook.com/profile.php?id=100000689849077</URL>
    </CONTACT>
</CONTACTS>

Я хочу добавить идентификатор элемента перед FirstName в моем XML-файле; я хотел бы извлечь идентификатор из тега URL, если URL доступен или я хочу извлечьпервые шесть писем с адреса электронной почты, чтобы поместить его в идентификатор (уникальный).Потому что в некоторых контактах нет 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>

Это часть моей вчерашней проблемы Преобразование новичка с использованием apply-templates и манипулирования строками в дочернем узле ;поскольку это другой вопрос, я поднимаю другой вопрос.

1 Ответ

3 голосов
/ 19 июня 2011

Похоже, что вы хотите выбрать часть 'id' строки URL внутри элемента URL. Вы должны выбрать подстроку после ?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.


Бонусный ответ на комментарий к вопросу:

Я хотел бы извлечь идентификатор из тега URL, если URL доступен, или я хочу извлечь первые шесть букв из адреса электронной почты, чтобы вставить его в идентификатор (уникальный) (...) Если у нас есть один несколько адресов электронной почты, тогда мы можем выбрать любую из первых шести букв из адреса электронной почты. Я думаю, что контакты должны иметь хотя бы один адрес электронной почты, если URL отсутствует ...

        <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>
...