使用 XSLT 将常规文本文件转换为 XML

发布于 2024-11-01 08:26:19 字数 351 浏览 0 评论 0原文

我有一个文本文件,如下所示:

XXX^YYYY^AAAAA^XXXXXX^AAAAAA....

字段使用插入符号(^)分隔,我的假设是:

第一个字段= NAME
第二个字段 = 姓氏
第三个字段 = 地址

等。

我想使用 xsl (XSLT) 将其转换为有效的 XML。 例如:

<name>XXX</name>
<l_name>YYYY</l_name>

我知道使用 Perl 可以轻松完成,但如果可能的话,我需要使用 XSLT 来完成。

I have a text file which looks like that:

XXX^YYYY^AAAAA^XXXXXX^AAAAAA....

Fields are separated using a caret(^), my presumptions are:

the first field = NAME
the second filed = Last name
third field = Address

etc..

I would like to turn it into a valid XML using xsl (XSLT).
such as:

<name>XXX</name>
<l_name>YYYY</l_name>

I know It can be done easily with Perl, but I need to do it with XSLT, if possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦太阳 2024-11-08 08:26:19

可以使用标准 XSLT 2.0 函数读取文本(非 XML)文件 未解析-text()

然后可以使用标准 XPath 2.0 函数 tokenize()< /strong> 和另外两个接受正则 a 表达式的标准 XPath 2.0 函数< /a> 作为他们的一员参数 -- matches()replace()

XSLT 2.0 有自己强大的使用正则表达式处理文本处理的说明:、<强>和<强><一href="http://www.w3.org/TR/xslt20/#element-non-matching-substring">指导。

通过以下实际示例中的这些函数和指令,了解 XSLT 文本处理的一些更强大的功能:XSLT WideFinder 问题的解决方案

最后,这是一个 XSLT 1.0 解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 xmlns:my="my:my" exclude-result-prefixes="ext my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:fieldNames>
  <name>FirstName</name>
  <name>LastName</name>
  <name>City</name>
  <name>State</name>
  <name>Zip</name>
 </my:fieldNames>

 <xsl:variable name="vfieldNames" select=
  "document('')/*/my:fieldNames"/>

 <xsl:template match="/">
  <xsl:variable name="vrtfTokens">
   <xsl:apply-templates/>
  </xsl:variable>

  <xsl:variable name="vTokens" select=
       "ext:node-set($vrtfTokens)"/>

  <results>
   <xsl:apply-templates select="$vTokens/*"/>
  </results>
 </xsl:template>

 <xsl:template match="text()" name="tokenize">
  <xsl:param name="pText" select="."/>

     <xsl:if test="string-length($pText)">
       <xsl:variable name="vWord" select=
       "substring-before(concat($pText, '^'),'^')"/>

       <word>
        <xsl:value-of select="$vWord"/>
       </word>

       <xsl:call-template name="tokenize">
        <xsl:with-param name="pText" select=
         "substring-after($pText,'^')"/>
       </xsl:call-template>
     </xsl:if>
 </xsl:template>

 <xsl:template match="word">
  <xsl:variable name="vPos" select="position()"/>

  <field>
      <xsl:element name="{$vfieldNames/*[position()=$vPos]}">
      </xsl:element>
      <value><xsl:value-of select="."/></value>
  </field>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于以下 XML 文档时:

<t>John^Smith^Bellevue^WA^98004</t>

生成所需的正确结果

<results>
   <field>
      <FirstName/>
      <value>John</value>
   </field>
   <field>
      <LastName/>
      <value>Smith</value>
   </field>
   <field>
      <City/>
      <value>Bellevue</value>
   </field>
   <field>
      <State/>
      <value>WA</value>
   </field>
   <field>
      <Zip/>
      <value>98004</value>
   </field>
</results>

Text (non-XML) files can be read with the standard XSLT 2.0 function unparsed-text().

Then one can use the standard XPath 2.0 function tokenize() and two other standard XPath 2.0 functions that accept regular a expression as one of their arguments -- matches() and replace().

XSLT 2.0 has its own powerful instructions to handle text processing using regular expressions:: the <xsl:analyze-string>, the <xsl:matching-substring> and the <xsl:non-matching-substring> instruction.

See some of the more powerful capabilities of XSLT text processing with these functions and instructions in this real-world example: an XSLT solution to the WideFinder problem.

Finally, here is an XSLT 1.0 solution:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 xmlns:my="my:my" exclude-result-prefixes="ext my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:fieldNames>
  <name>FirstName</name>
  <name>LastName</name>
  <name>City</name>
  <name>State</name>
  <name>Zip</name>
 </my:fieldNames>

 <xsl:variable name="vfieldNames" select=
  "document('')/*/my:fieldNames"/>

 <xsl:template match="/">
  <xsl:variable name="vrtfTokens">
   <xsl:apply-templates/>
  </xsl:variable>

  <xsl:variable name="vTokens" select=
       "ext:node-set($vrtfTokens)"/>

  <results>
   <xsl:apply-templates select="$vTokens/*"/>
  </results>
 </xsl:template>

 <xsl:template match="text()" name="tokenize">
  <xsl:param name="pText" select="."/>

     <xsl:if test="string-length($pText)">
       <xsl:variable name="vWord" select=
       "substring-before(concat($pText, '^'),'^')"/>

       <word>
        <xsl:value-of select="$vWord"/>
       </word>

       <xsl:call-template name="tokenize">
        <xsl:with-param name="pText" select=
         "substring-after($pText,'^')"/>
       </xsl:call-template>
     </xsl:if>
 </xsl:template>

 <xsl:template match="word">
  <xsl:variable name="vPos" select="position()"/>

  <field>
      <xsl:element name="{$vfieldNames/*[position()=$vPos]}">
      </xsl:element>
      <value><xsl:value-of select="."/></value>
  </field>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied to the following XML document:

<t>John^Smith^Bellevue^WA^98004</t>

the wanted, correct result is produced:

<results>
   <field>
      <FirstName/>
      <value>John</value>
   </field>
   <field>
      <LastName/>
      <value>Smith</value>
   </field>
   <field>
      <City/>
      <value>Bellevue</value>
   </field>
   <field>
      <State/>
      <value>WA</value>
   </field>
   <field>
      <Zip/>
      <value>98004</value>
   </field>
</results>
鸠书 2024-11-08 08:26:19

使用 XSLT 1.0 进行标记和排序

如果您使用 xslt 2.0,那就简单得多:
fn:tokenize(字符串,模式)

Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")

Tokenizing and sorting with XSLT 1.0

If you use xslt 2.0 it's much simpler:
fn:tokenize(string,pattern)

Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文