2014-12-18 6 views
0

Это образец XML я хочу, чтобы преобразовать:Разделение и преобразование разделителями строки в XSLT

<dsQueryResponse> 
    <Rows> 
    <Row Contacts="#111;#Smith, John;#112;#Sue, Mary;#113;#Jones, Rick" /> 
    <Row Contacts="#114;#Lee, Thomas;#115;#Richards, Kate" /> 
    </Rows> 
</dsQueryResponse> 

Использование XSLT, как я разделить это так, что оно выглядит результат:

<div> 
    <span>#111;#Smith, John</span> 
    <span>#112;#Sue, Mary</span> 
    <span>#113;#Jones, Rick</span> 
</div> 
<div> 
    <span>#114;#Lee, Thomas</span> 
    <span>#115;#Richards, Kate</span> 
</div> 

; Используется в качестве разделителя при наличии каждого набора, что меня пугает.


Edit:
Да, я в курсе этого post.
Я пробовал, но он не разбивается так, как мне это нужно.
; является разделителем и также является частью разделяемого объекта.

+0

@Tomalak Этот вопрос немного сложнее. –

+0

@ DanielHaley Этот вопрос немного сложнее. –

+0

Я видел этот пост и попробовал, но он слишком сильно раскалывает его. Например, '# 111',' #Smith, John', '# 112',' #Sue, Mary' ** (4) ** вместо '# 111; #Smith, John',' # 112; # Sue, Mary' ** (2) ** – Katie

ответ

2

Попробуй так:

XSLT 1,0

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

<xsl:template match="/dsQueryResponse"> 
    <body> 
     <xsl:for-each select="Rows/Row"> 
      <div> 
       <xsl:call-template name="tokenize"> 
        <xsl:with-param name="text" select="@Contacts"/> 
       </xsl:call-template> 
      </div> 
     </xsl:for-each> 
    </body> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="text"/> 
    <xsl:param name="delimiter" select="';'"/> 
    <xsl:choose> 
     <xsl:when test="contains($text, $delimiter) and contains(substring-after($text, $delimiter), $delimiter)"> 
      <span> 
       <xsl:value-of select="substring-before($text, $delimiter)"/> 
       <xsl:value-of select="$delimiter"/> 
       <xsl:value-of select="substring-before(substring-after($text, $delimiter), $delimiter)"/> 
      </span> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="text" select="substring-after(substring-after($text, $delimiter), $delimiter)"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <span> 
       <xsl:value-of select="$text"/> 
      </span> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Примечание:
Если есть XML ад, авторы исходного документа должны гореть в нем.

+0

Хахаха! Отлично! (XML генерируется SharePoint. Не самый простой из XML-документов, с которым это точно, ха-ха) – Katie

Смежные вопросы