Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何将纯文本转换为xsl_Xml_Xslt - Fatal编程技术网

Xml 如何将纯文本转换为xsl

Xml 如何将纯文本转换为xsl,xml,xslt,Xml,Xslt,我尝试了不同的方法将这些信息处理为xml,但没有任何效果 请帮忙 我在一个标记内有多行。我必须将它们转换为正确的xml文档 这是文本/字符串 <params> userdata_token=>'abd' userdata_time=>'12/09/2011' user_message_address_city=>'Manchester|Harrow|' user_message_addres

我尝试了不同的方法将这些信息处理为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>

userdata_令牌=>'abd'
用户数据\时间=>'12/09/2011'
用户信息地址城市=>'Manchester | Harrow |'
用户信息地址邮政编码=>'M20 7LD | | HA0 4BN'
用户|消息|地址|收件人=>“|皮特|”
将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>

阿布德
12/09/2011
曼彻斯特
M20 7LD
耙
皮特
40亿阿富汗

请有人帮我把字符串拆分成层次结构元素和相应的值,我希望用XSL和Java来实现这一点,out是格式良好的xml。我没有用于输出的xsd,所以我不能使用绑定模式。

XSL并不真正关心您的输出是什么;输入必须是格式良好的XML。在本例中,XML格式良好,但文本节点包含一些需要理解的格式化信息。我的建议是不要太热衷于使用XSL。使用正则表达式甚至StringTokenizer的直接解析将提取您的数据。从这里可以很容易地编写结果文档。

这在XSLT2中是完全可能的。看看unparsed text函数,您可以使用它来读取文件的内容。您可以首先调用unparsed text available以确保文件可访问,这样XSL转换就不会失败


然后可以将字符串拆分为行和名称/值对。查看tokenize、stringbefore和stringafter函数,了解如何执行此操作。最后,创建您想要使用的输出结构。

这在XSLT2.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>
结果是

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

阿布德
12/09/2011
曼彻斯特
耙
M20 7LD
40亿阿富汗
皮特

要完成这项工作,只需添加一些分组——我现在准备开始工作,所以可以在今天晚些时候完成这项工作。:)

+1是一个很好的答案@苏吉特-这里有一个链接到另一个迪米特里·诺瓦切夫的答案,可能会有所帮助。谢谢Dimitre,我将尝试调整此解决方案。
<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>