这可能听起来很重复,但我无法理解一些基本的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>
谢谢
答案 0 :(得分:1)
我认为这不适用于您的文档。尽管其他主题的标题是什么,但他们使用的输入 是一个有效的XML文档。您显示的输入只是一个文本文件,而AFAIK无法使用XSLT 1.0处理它。
回答你的问题:表达式:
document('')/*/my:fieldNames
在样式表本身中选择以下元素:
<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>