我有一个树结构的平面文件,我需要为此写入动态XSLT。平面文件数据不断变化。例如,我的标签A,B,C,D如下给出。然后下一个文件可以具有e,f,g,h。树本身将具有4-6个深度。
我可以将文件读取到平原列表中,每行循环,但无法在XSLT中创建相同的树结构。我想在Java对象中读取相同的内容,然后在xslt中创建相同的内容。
读取文件:
while ((item = in.readLine()) != null) {
lineNo++;
String rowContent = item;
}
输入文件:
元素a 元素b 元素c 数据 元素d 数据
预期输出XSLT:
<xsl:template match="/">
<A>
<B>
<C><xsl:text>data</xsl:text></C>
<D><xsl:text>data</xsl:text></D>
</B>
</A>
</xsl:template>
我是XSLT的新手,任何帮助将不胜感激。谢谢!!!
这是一个使用XSLT 3进行解析和组的示例,然后将文本数据嵌套到层次结构xml中:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="input-string" as="xs:string"> Element A
Element B
Element C
Data
Element D
Data</xsl:param>
<xsl:output method="xml" indent="yes"/>
<xsl:function name="mf:nest" as="node()*">
<xsl:param name="input" as="map(xs:string, item())*"/>
<xsl:variable name="min-level" as="xs:integer" select="min($input?level)"/>
<xsl:for-each-group select="$input" group-starting-with=".[?level = $min-level and ?type = 'element']">
<xsl:choose>
<xsl:when test="?type = 'element'">
<xsl:element name="{?name}">
<xsl:sequence select="mf:nest(tail(current-group()))"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="?value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:function>
<xsl:template name="xsl:initial-template" match="/">
<xsl:variable name="lines" as="map(xs:string, item())*"
select="tokenize($input-string, 'n') !
analyze-string(., '^( *)(((Element) (w+))|(.+))') ! *:match !
map {
'type' : if (.//*:group[@nr = 4] = 'Element') then 'element' else 'data',
'name' : string(.//*:group[@nr = 5]),
'level' : string-length(*:group[@nr = 1]),
'value' : string(.//*:group[@nr = 6])
}"/>
<xsl:sequence select="mf:nest($lines)"/>
</xsl:template>
</xsl:stylesheet>
输出是普通的xml
<A>
<B>
<C>Data</C>
<D>Data</D>
</B>
</A>
https://xsltfiddle.liberty-development.net/6r5gh3y/2
如果确实是使用xsl:namespace-alias
。