Как преобразовать обычный текст в XSL - PullRequest
2 голосов
/ 05 октября 2011

Я пробовал другой способ обработки этой информации в XML, ничего не работает.

Пожалуйста, помогите

У меня есть несколько строк в одном теге. Я должен преобразовать их в правильный XML-документ.

Вот текст / строка

  <params>
         userdata_token=>'abd'
         userdata_time=>'12/09/2011'
         user_message_address_city=>'Manchester|Harrow|'
         user_message_address_postcode=>'M20 7LD||HA0 4BN'
         user_message_address_addressee=>'|Pete|'
  </params>

в формате xml, например

  <params>
    <userdata>
      <token>abd</temp>
      <time>12/09/2011</time>
    </userdata>
    <user>
      <message>
         <address>
           <city>Manchester</city>
           <postcode>M20 7LD</postcode>
           <addressee></addressee>
         </address>     
         <address>
           <city>Harrow</city>
           <postcode></postcode>
           <addressee>Pete</addressee>
         </address>  
         <address>
           <city></city>
           <postcode>HA0 4BN</postcode>
           <addressee></addressee>
         </address>  
       </message>
      <user>    
  </params>

Пожалуйста, кто-нибудь может помочь в разбиении строки на иерархические элементы и соответствующее значение, я собираюсь сделать это в XSL и Java, в общем, хорошо сформированный xml. У меня нет xsd для out out, поэтому я не могу использовать схему привязки.

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Это действительно очень удобно в XSLT 2.0 .

В целях быстрой демонстрации (не полностью законченной и отшлифованной, но дающей представление о такой обработке с помощью XSLT 2.0), я придумал это всего за несколько минут:

<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:my="my:my">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>

        <xsl:variable name="vLines" select=
             "tokenize(string(/*), '\s*&#xA;\s*')[.]"/>

     <xsl:template match="/">
         <xsl:sequence select="my:ProcessLines($vLines)"/>
          <xsl:text>&#xA;</xsl:text>
     </xsl:template>

     <xsl:function name="my:ProcessLines" as="element()*">
      <xsl:param name="pLines" as="xs:string*"/>

      <xsl:for-each select="$pLines">
        <xsl:sequence select="my:ProcessLine(.)"/>
      </xsl:for-each>
     </xsl:function>

     <xsl:function name="my:ProcessLine" as="element()*">
      <xsl:param name="pLine" as="xs:string*"/>

      <xsl:variable name="vSides" select="tokenize($pLine, '=>')"/>

      <xsl:variable name="vLHS" select="$vSides[1]"/>
      <xsl:variable name="vRHS" select=
          "substring($vSides[2],2, string-length($vSides[2])-2)"/>

      <xsl:variable name="vGendElement" select=
           "my:MakeElement(tokenize($vLHS, '_'))"/>

      <xsl:sequence select="my:ImplantValues($vGendElement, $vRHS)"/>
     </xsl:function>

     <xsl:function name="my:MakeElement" >
      <xsl:param name="pElemNames" as="xs:string*"/>

       <xsl:if test="not(empty($pElemNames))">
         <xsl:element name="{$pElemNames[1]}">
           <xsl:sequence select=
            "my:MakeElement($pElemNames[position() > 1])"/>
         </xsl:element>
       </xsl:if>
     </xsl:function>

     <xsl:function name="my:ImplantValues" as="element()*">
       <xsl:param name="pTree" as="element()"/>
       <xsl:param name="pValues" as="xs:string"/>

       <xsl:variable name="vValues" select="tokenize($pValues, '\|')[.]"/>

       <xsl:for-each select="$vValues[string-length(normalize-space()) > 0]">
         <xsl:apply-templates select="$pTree">
          <xsl:with-param name="pValue" select="."/>
         </xsl:apply-templates>
       </xsl:for-each>
     </xsl:function>

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

     <xsl:template match="*[not(*)]">
       <xsl:param name="pValue"/>

       <xsl:copy>
         <xsl:copy-of select="@*"/>
         <xsl:copy-of select="$pValue"/>
       </xsl:copy>
     </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному XML-документу (он также может просто прочитать входные данные из файла, используя функцию unparsed-text()):

<params>
  userdata_token=>'abd'
  userdata_time=>'12/09/2011'
  user_message_address_city=>'Manchester|Harrow|'
  user_message_address_postcode=>'M20 7LD||HA0 4BN'
  user_message_address_addressee=>'|Pete|'
</params>

результат :

<userdata>
   <token>abd</token>
</userdata>
<userdata>
   <time>12/09/2011</time>
</userdata>
<user>
   <message>
      <address>
         <city>Manchester</city>
      </address>
   </message>
</user>
<user>
   <message>
      <address>
         <city>Harrow</city>
      </address>
   </message>
</user>
<user>
   <message>
      <address>
         <postcode>M20 7LD</postcode>
      </address>
   </message>
</user>
<user>
   <message>
      <address>
         <postcode>HA0 4BN</postcode>
      </address>
   </message>
</user>
<user>
   <message>
      <address>
         <addressee>Pete</addressee>
      </address>
   </message>
</user>

Чтобы закончить это, нужно только добавить некоторую группировку - я готовлюсь к работе сейчас, так что это можно будет сделать позже сегодня. :)

1 голос
/ 05 октября 2011

Это вполне возможно в XSLT 2. Взгляните на функцию unparsed-text, вы можете использовать ее для чтения содержимого файла.Вы можете сначала вызвать unparsed-text-available, чтобы убедиться, что файл доступен, поэтому преобразование XSL не завершится неудачей, если это не так.

Затем строку можно разбить на строки и пары имя / значение.,Посмотрите на функции tokenize, string-before и string-after, чтобы узнать, как это сделать.Наконец, создайте структуру вывода, которую вы хотите использовать.

0 голосов
/ 05 октября 2011

XSL на самом деле не волнует, какой у вас вывод;вход должен быть правильно сформированным XML.В этом случае ваш XML является правильно сформированным, но текстовый узел содержит некоторую отформатированную информацию, в которой вам нужно разобраться.Мой совет - не слишком использовать XSL.Прямой анализ с использованием регулярных выражений или даже StringTokenizer извлечет ваши данные.Оттуда легко написать итоговый документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...