2015-06-23 5 views
0

XML-код, предоставленный клиентом, содержит адрес доставки в виде строки, разделенной запятой, я хотел бы разделить эту строку на именованные узлы с использованием XSLT 1.0.XSLT 1.0 Разделить разделяемую запятую строку на именованные узлы

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <text> 
    Company, Streetaddress 20, 1234 AA, City 
    </text> 
</root> 

Выход

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <text> 
    <COMPANY>Company</COMPANY> 
    <ADDRESS>Streetaddress 20</ADDRESS> 
    <ZIPCODE>1234 AA</ZIPCODE> 
    <CITY>City</CITY> 
    </text> 
</root> 

Я попробовал несколько рекурсивных шаблонов для XSLT 1.0, которые делают тонкое расщепление работу, но в результате узлы с одинаковыми именами.

Если возможно, как это можно достичь с помощью XSLT 1.0?

+0

Можете ли вы опубликовать XSLT, а? – potame

ответ

2

Должен ли быть рекурсивный шаблон? Как насчет прямой вперед цепи substring-before и substring-after, как это:

<xsl:template match="text"> 
    <xsl:copy> 
     <COMPANY> 
     <xsl:value-of select="normalize-space(substring-before(., ','))"/> 
     </COMPANY> 
     <xsl:variable name="s1" select="substring-after(., ',')"/> 
     <ADDRESS> 
     <xsl:value-of select="normalize-space(substring-before($s1, ','))"/> 
     </ADDRESS> 
     <xsl:variable name="s2" select="substring-after($s1, ',')"/> 
     <ZIPCODE> 
     <xsl:value-of select="normalize-space(substring-before($s2, ','))"/> 
     </ZIPCODE> 
     <CITY> 
     <xsl:value-of select="normalize-space(substring-after($s2, ','))"/> 
     </CITY> 
    </xsl:copy> 
    </xsl:template> 
+0

Это наверняка сделало трюк! Рекурсивный не обязательно в этом случае, я просто не мог найти шаблон без него. – Indy2

2

Для удовольствия, здесь общая версия, используя рекурсивный шаблон.

<xsl:template match="text"> 
    <xsl:copy> 
    <xsl:call-template name="parse-comma-separated"> 
     <xsl:with-param name="elements" select="'COMPANY,ADDRESS,ZIPCODE,CITY'"/> 
     <xsl:with-param name="text" select="."/> 
    </xsl:call-template> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="parse-comma-separated"> 
    <xsl:param name="elements"/> 
    <xsl:param name="text"/> 
    <xsl:choose> 
    <xsl:when test="contains($elements, ',')"> 
     <xsl:element name="{normalize-space(substring-before($elements, ','))}"> 
     <xsl:value-of select="normalize-space(substring-before($text, ','))"/> 
     </xsl:element> 
     <xsl:call-template name="parse-comma-separated"> 
     <xsl:with-param name="elements" select="substring-after($elements, ',')"/> 
     <xsl:with-param name="text" select="substring-after($text, ',')"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="{normalize-space($elements)}"> 
     <xsl:value-of select="normalize-space($text)"/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
0

В качестве прилагаемого XML имел только адрес в качестве единственного узла (Streettaddress 20) Я добавил вторую переменную, чтобы разделить адресную строку в StreetAddress и номер дома.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/> 
    <xsl:template match="text"> 
    <root> 
     <COMPANY> 
     <xsl:value-of select="normalize-space(substring-before(., ','))"/> 
     </COMPANY> 
     <xsl:variable name="s1" select="substring-after(., ',')"/> 
     <xsl:variable name="address_temp" select="normalize-space(substring-before($s1, ','))"/> 
     <ADDRESS> 
     <xsl:value-of select="normalize-space(substring-before($address_temp, ' '))"/> 
     </ADDRESS> 
     <HOUSENUMBER> 
     <xsl:value-of select="normalize-space(substring-after($address_temp, ' '))"/> 
     </HOUSENUMBER> 
     <xsl:variable name="s2" select="substring-after($s1, ',')"/> 
     <ZIPCODE> 
     <xsl:value-of select="normalize-space(substring-before($s2, ','))"/> 
     </ZIPCODE> 
     <CITY> 
     <xsl:value-of select="normalize-space(substring-after($s2, ','))"/> 
     </CITY> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 

Результат:

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
    <COMPANY>Company</COMPANY> 
    <ADDRESS>Streetaddress</ADDRESS> 
    <HOUSENUMBER>20</HOUSENUMBER> 
    <ZIPCODE>1234 AA</ZIPCODE> 
    <CITY>City</CITY> 
</root> 
Смежные вопросы