2013-05-24 3 views
0

У меня есть некоторые данные с разделителями двойной длины внутри некоторых тегов XML, и я хотел бы заменить/преобразовать разделительный текст в XML.
В разделительном тексте также используется двоеточие для разделения заголовка и данных, например: || тэг: данные ||
Названия заголовков или тегов могут быть любыми, это всего лишь один пример. Поэтому я не знаю заранее, что я получаю. Я должен взять то, что указано перед двоеточием, и использовать это.Использование XSLT для преобразования текста с разделителями в XML

<doc> 
     <arr name="content"> 
     <str> stream_source_info docname stream_content_type text/html stream_size 412 Content-Encoding ISO-8859-1 stream_name docname Content-Type text/html; charset=ISO-8859-1 resourceName docname  ||phone:3282||email:[email protected]||officenumber:D-107A||vcard:https://c3qa/profiles/vcard/profile.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b||photo:https://c3qa/profiles/photo.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846||pronunciation:https://c3qa/profiles/audio.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846|| </str> 
    </arr> 
</doc> 

Могу ли я использовать XSLT для преобразования этого XML в это?

<doc> 
     <arr name="content"> 
     <str> stream_source_info docname stream_content_type text/html stream_size 412 Content-Encoding ISO-8859-1 stream_name docname Content-Type text/html; charset=ISO-8859-1 resourceName docname 
      <phone>3282</phone> 
      <email>[email protected]</email> 
      <officenumber>D-107A</officenumber> 
      <vcard>https://c3qa/profiles/vcard/profile.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b</vcard> 
      <photo>https://c3qa/profiles/photo.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846</photo> 
      <pronunciation>https://c3qa/profiles/audio.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846</pronunciation> 
     </str> 
    </arr> 
</doc> 

URL-адреса должны быть обернуты в CDATA, и разграниченная версия должна быть заменена.
Может кто-нибудь указать мне в правильном направлении? Спасибо,

ответ

1

analyze-string может помочь с Saxon 9.5 таблицы стилей

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="str"> 
    <xsl:copy> 
    <xsl:analyze-string select="." regex="\|((\|[^|]+\|)+)\|"> 
     <xsl:matching-substring> 
     <xsl:analyze-string select="regex-group(1)" regex="\|(\w+):([^|]+)\|"> 
      <xsl:matching-substring> 
      <xsl:element name="{regex-group(1)}"> 
       <xsl:value-of select="regex-group(2)"/> 
      </xsl:element> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

превращает входной

<doc> 
     <arr name="content"> 
     <str> stream_source_info docname stream_content_type text/html stream_size 412 Content-Encoding ISO-8859-1 stream_name docname Content-Type text/html; charset=ISO-8859-1 resourceName docname  ||phone:3282||email:[email protected]||officenumber:D-107A||vcard:https://c3qa/profiles/vcard/profile.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b||photo:https://c3qa/profiles/photo.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846||pronunciation:https://c3qa/profiles/audio.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846|| </str> 
    </arr> 
</doc> 

в результате

<doc> 
     <arr name="content"> 
     <str> stream_source_info docname stream_content_type text/html stream_size 412 Content-Encoding ISO-8859-1 stream_name docname Content-Type text/html; charset=ISO-8859-1 resourceName docname  <phone>3282</phone> 
     <email>[email protected]</email> 
     <officenumber>D-107A</officenumber> 
     <vcard>https://c3qa/profiles/vcard/profile.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b</vcard> 
     <photo>https://c3qa/profiles/photo.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846</photo> 
     <pronunciation>https://c3qa/profiles/audio.do?key=5c28d263-d8aa-4a8a-ae90-4e8b13de7a0b&amp;lastMod=1348674215846</pronunciation> 
     </str> 
    </arr> 
</doc> 
+0

+1! Отлично! Спасибо, это сработало красиво! Мне пришлось поиграть с саксонской командной строкой, но я получил ее работу. – djm

+0

Привет, Мартин, мой XML изменился, и иногда str имеет имя i.e. как сохранить имя? – djm

+0

Хорошо, я изменил match = "str" ​​на match = "str/@ type", и это, похоже, сработало. Это правильно? – djm

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