下面是输入XML(Little Big),对于更大的输入XML和输出xml
抱歉<tutorial>
<lessons>
<lesson>
chapter unit 1 page
</lesson>
<lesson>
chapter unit 10~ page
</lesson>
<lesson>
chapter unit page
</lesson>
<lesson>
note lesson
</lesson>
<lessons1>
<lesson>
chapter unit 1 page
</lesson>
<lesson>
description page
</lesson>
<lesson>
chapter unit page
</lesson>
</lessons1>
</lessons>
</tutorial>
下面是我的输出Xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<Geography>
<historical>
<social>
<toc1>
<toc>
<chapter>chapter</chapter>
<unit>unit 1</unit>
<pages>page</pages>
</toc>
<toc>
<chapter>chapter</chapter>
<unit>unit 10</unit>
<pages>page</pages>
</toc>
<toc>
<chapter>chapter</chapter>
<unit>unit 10</unit>
<pages>page</pages>
</toc>
<toc>
<sample>
<original>Note Lesson</orginal>
</sample>
</toc>
</toc1>
<toc2>
<toc>
<chapter>chapter</chapter>
<unit>unit 1</unit>
<pages>page</pages>
</toc>
<toc>
<sample>
<original>description page</orginal>
</sample>
</toc>
<toc>
<chapter>chapter</chapter>
<unit>unit 10</unit>
<pages>page</pages>
</toc>
</toc2>
</social>
这是安静的大输出XML文件,对不起。
在单位中,如果我在输出中有单位1,它将显示为单位1但是例如如果我有单位10~它将显示为单位10如果没有值,则必须删除〜默认情况下它必须显示单位10。
小解释
我的输出XML必须区分三个类别
1)章
2)单位
3)页面
输入将采用三种不同类型的格式
1)XML有章节,单位(带有tilda符号的数字)&amp;页面
2)XML有章节,单位(没有tilda符号的数字)&amp;页面
3)XML只有页面ex ..(注意和说明)所以这里如果例如我有10~(单位)输出将显示10,如果输入xml没有值(对于单位) )在输出xml中,它将显示10作为默认数字 - 昨天的karthic
请帮助我并在XSLT的帮助下指导我。
此致 Karthic
答案 0 :(得分:1)
此转化:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vNames" select="'chapter', 'unit', 'pages'"/>
<xsl:template match="lessons">
<Geography>
<historical>
<social>
<toc1>
<xsl:apply-templates select="lesson"/>
</toc1>
<xsl:apply-templates select="lessons1"/>
</social>
</historical>
</Geography>
</xsl:template>
<xsl:template match="lesson[starts-with(normalize-space(), 'chapter')]">
<xsl:variable name="vNorm" select=
"translate(normalize-space(), '~', '')"/>
<xsl:variable name="vAtNumber" select=
"substring-after($vNorm, 'chapter unit')"/>
<xsl:variable name="vNum" select=
"if(matches($vAtNumber, '^\s*\d+'))
then replace($vAtNumber, '(^\s*(\d+)).*$', '$2')
else '10'
"/>
<xsl:analyze-string select="."
regex="(chapter\s+)(unit\s*)(((\d*~?)\s+)?page)">
<xsl:matching-substring>
<toc>
<chapter>chapter</chapter>
<unit>unit <xsl:value-of select="$vNum"/></unit>
<pages>page</pages>
</toc>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
<xsl:template match="lesson">
<sample>
<original><xsl:value-of select="normalize-space()"/></original>
</sample>
</xsl:template>
<xsl:template match="lessons1">
<toc2>
<xsl:apply-templates/>
</toc2>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时:
<tutorial>
<lessons>
<lesson>
chapter unit 1 page
</lesson>
<lesson>
chapter unit 10~ page
</lesson>
<lesson>
chapter unit page
</lesson>
<lesson>
note lesson
</lesson>
<lessons1>
<lesson>
chapter unit 1 page
</lesson>
<lesson>
description page
</lesson>
<lesson>
chapter unit page
</lesson>
</lessons1>
</lessons>
</tutorial>
会产生想要的正确结果:
<Geography>
<historical>
<social>
<toc1>
<toc>
<chapter>chapter</chapter>
<unit>unit 1</unit>
<pages>page</pages>
</toc>
<toc>
<chapter>chapter</chapter>
<unit>unit 10</unit>
<pages>page</pages>
</toc>
<toc>
<chapter>chapter</chapter>
<unit>unit 10</unit>
<pages>page</pages>
</toc>
<sample>
<original>note lesson</original>
</sample>
</toc1>
<toc2>
<toc>
<chapter>chapter</chapter>
<unit>unit 1</unit>
<pages>page</pages>
</toc>
<sample>
<original>description page</original>
</sample>
<toc>
<chapter>chapter</chapter>
<unit>unit 10</unit>
<pages>page</pages>
</toc>
</toc2>
</social>
</historical>
</Geography>
答案 1 :(得分:0)
如果你只想删除“〜”,请使用translate(xxx,'〜','')
除此之外,我担心你没有明确要求。例如,我不明白这个条款:
如果默认情况下没有值,则必须显示单位10