我有一个XML文档A.xml
(这部分已经完成。B.xml
A.xml
@id
B.xml
现在我想实现一种机制,该机制将跟踪(在临时树内)内character count
的每个文本节点,B.xml
并且基于maximum character count
,该机制将能够B.xml
在一个或多个部分中拆分和序列化。
源 XML 文档 ( A.xml
):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!--
Rules for splitting:
1. «head/text()» is common for all splits.
2. split files can have 600 characters max each.
3. «title» elements could not be the last element of the any result document.
-->
<head><!-- 8 characters -->Kinesics</head>
<section>
<para><!-- 37 characters -->From Wikipedia, the free encyclopedia</para>
<para><!-- 204 characters [space normalized]-->Kinesics is the interpretation of body
language such as facial expressions and gestures — or, more formally, non-verbal
behavior related to movement, either of any part of the body or the body as a
whole. </para>
<section>
<title><!-- 19 characters -->Birdwhistell's work</title>
<para><!-- 432 characters [space normalized]-->The term was first used (in 1952) by Ray
Birdwhistell, an anthropologist who wished to study how people communicate through
posture, gesture, stance, and movement. Part of Birdwhistell's work involved making
film of people in social situations and analyzing them to show different levels of
communication not clearly seen otherwise. The study was joined by several other
anthropologists, including Margaret Mead and Gregory Bateson.</para>
<para><!-- 453 characters [space normalized]--> Drawing heavily on descriptive
linguistics, Birdwhistell argued that all movements of the body have meaning (i.e.
are not accidental), and that these non-verbal forms of language (or paralanguage)
have a grammar that can be analyzed in similar terms to spoken language. Thus, a
"kineme" is "similar to a phoneme because it consists of a group of movements which
are not identical, but which may be used interchangeably without affecting social
meaning".</para>
</section>
<section>
<title><!-- 19 characters -->Modern applications</title>
<para><!-- 390 characters [space normalized]-->Kinesics are an important part of
non-verbal communication behavior. The movement of the body, or separate parts,
conveys many specific meanings and the interpretations may be culture bound. As many
movements are carried out at a subconscious or at least a low-awareness level,
kinesic movements carry a significant risk of being misinterpreted in an
intercultural communications situation.</para>
</section>
</section>
</root>
XSL 文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="no"/>
<!--update 1-->
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:variable name="root-replica">
<xsl:call-template name="create-root-replica">
<xsl:with-param name="context" select="*"/>
</xsl:call-template>
</xsl:variable>
<xsl:copy-of select="$root-replica"/>
<!--
<xsl:call-template name="split-n-serialize">
<xsl:with-param name="context" select="$root-replica"/>
</xsl:call-template>
-->
</xsl:template>
<xsl:template name="split-n-serialize">
<xsl:param name="context"/>
<xsl:for-each select="$context">
<xsl:result-document encoding="utf-8" href="{concat('split_',position(),'.xml')}" method="xml" indent="no">
<xsl:sequence select="."/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template name="create-root-replica">
<xsl:param name="context"/>
<root>
<head>
<xsl:value-of select="$context/head"/>
</head>
<xsl:apply-templates select="$context/*[not(self::head)]"/>
</root>
</xsl:template>
<xsl:template match="element()">
<xsl:element name="{local-name()}">
<xsl:attribute name="id">
<xsl:value-of select="generate-id()"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!--update 2-->
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)"/>
</xsl:template>
</xsl:transform>
我的输入 XML 包含1562
字符(假设\s+
等于),我喜欢
A.xml
使用源 xml 文档中提到的规则分成 4 个部分。
有谁知道如何做到这一点?非常感谢任何想法或意见。
更新 3
拆分文件的详细信息
1st File
8
37
204 = 249
2nd File
8
19
432 = 459
3rd File
8
453 = 461
4th File
8
19
390 = 417
拆分程序的详细信息:
元素 «head» 的内容应该是每个 XML 文件的一部分。
文件可以从部分中间拆分,但不能在段落中间拆分。
不是 «title» 元素应该出现在拆分的末尾。
拆分文件中的最大字符数(不包括开始和结束标签)最多为 600 个。
示例输出文件(缩进用于更好的可读性)
第一个文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<head>Kinesics</head>
<section id="d1e6">
<para id="d1e7">From Wikipedia, the free encyclopedia</para>
<para id="d1e10">Kinesics is the interpretation of body language such as facial expressions and gestures — or, more formally, non-verbal behavior related to movement, either of any part of the body or the body as a whole.</para>
</section>
</root>
第二个文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<head>Kinesics</head>
<section id="d1e6">
<section id="d1e13">
<title id="d1e14">Birdwhistell's work</title>
<para id="d1e17">The term was first used (in 1952) by Ray Birdwhistell, an anthropologist who wished to study how people communicate through posture, gesture, stance, and movement. Part of Birdwhistell's work involved making film of people in social situations and analyzing them to show different levels of communication not clearly seen otherwise. The study was joined by several other anthropologists, including Margaret Mead and Gregory Bateson.</para>
</section>
</section>
</root>
第三个文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<head>Kinesics</head>
<section id="d1e6">
<section id="d1e13">
<para id="d1e20">Drawing heavily on descriptive linguistics, Birdwhistell argued that all movements of the body have meaning (i.e. are not accidental), and that these non-verbal forms of language (or paralanguage) have a grammar that can be analyzed in similar terms to spoken language. Thus, a "kineme" is "similar to a phoneme because it consists of a group of movements which are not identical, but which may be used interchangeably without affecting social meaning".</para>
</section>
</section>
</root>
第 4 个文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<head>Kinesics</head>
<section id="d1e6">
<section id="d1e23">
<title id="d1e24">Modern applications</title>
<para id="d1e27">Kinesics are an important part of non-verbal communication behavior. The movement of the body, or separate parts, conveys many specific meanings and the interpretations may be culture bound. As many movements are carried out at a subconscious or at least a low-awareness level, kinesic movements carry a significant risk of being misinterpreted in an intercultural communications situation.</para>
</section>
</section>
</root>