转换期间无法理解某些概念

时间:2014-02-14 12:39:13

标签: xml xslt text

这可能听起来很重复,但我无法理解一些基本的xslt概念

实际上我对xslt的概念很新,并且一直在研究如何将文本文档转换为xml。

但是我发现在stackoverlow(Regular text file to XML using XSLT

中跟随XSLt
     <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>

但实际上无法得到这个xslt中发生的事情,就像下面的代码意味着什么

<xsl:variable name="vfieldNames" select="document('')/*/my:fieldNames"/>  (What is selected in the following code)?

Folloing是文本文档

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

以下是输出

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

谢谢

2 个答案:

答案 0 :(得分:1)

  1. 我认为这不适用于您的文档。尽管其他主题的标题是什么,但他们使用的输入 是一个有效的XML文档。您显示的输入只是一个文本文件,而AFAIK无法使用XSLT 1.0处理它。

  2. 回答你的问题:表达式:

    document('')/*/my:fieldNames

  3. 在样式表本身中选择以下元素:

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

答案 1 :(得分:1)

在这一特定行:

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

document('')从执行它的样式表中选择数据(也就是说,它读取基本URI对应于所讨论的XSLT指令的URI的XML文档,请参阅Michael Kay的回答here

因此,检索以下内容并将其存储为变量$vfieldNames的内容:

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