看起来这应该很容易,但......
我正在尝试使用XSLT以纯文本形式提取XML文件的一部分,从而丢弃其余部分.
所以从这样的样本输入......
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://segonku.unl.edu/teianalytics/TEIAnalytics.rng"
type="xml"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0" n="Wright2-0034.sgml.xml">
<teiHeader type="text">
<fileDesc>
<titleStmt>
<title>Header Title</title>
</titleStmt>
<publicationStmt>
<p>Published</p>
</publicationStmt>
<sourceDesc>
<p>Sourced</p>
</sourceDesc>
</fileDesc>
</teiHeader>
<text>
<front>
</front>
<body>
<head>THE TITLE</head>
<div type="chapter" part="N" org="uniform" sample="complete">
<head>CHAPTER I</head>
<p>Some text.</p>
</div>
</body>
</text>
</TEI>
Run Code Online (Sandbox Code Playgroud)
...我正在尝试获取<body>标签中包含的文本及其所有子项.在这种情况下,所需的输出是:
THE TITLE
CHAPTER I
Some text.
Run Code Online (Sandbox Code Playgroud)
潜在并发症:<body>也可以存在于<front>物质和/或在<teiHeader>,所以我真正需要的是孩子们<body>当且仅当该标签是的子<text>和<TEI>.
我尝试过这样简单的XSL ......
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/TEI/text/body">
<xsl:apply-templates select="."/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
...但它给了我文件中所有内容的纯文本,而不仅仅是<body>元素.
谢谢!
我尝试过这样简单的XSL ......
...
Run Code Online (Sandbox Code Playgroud)<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="/TEI/text/body"> <xsl:apply-templates select="."/> </xsl:template> </xsl:stylesheet>...但它给了我文件中所有内容的纯文本,而不仅仅是
<body>元素.
其原因是XPath的一个着名属性/特性(以及数千个类似问题的原因)将任何未加前缀的名称视为属于"无命名空间.但是,提供的XML文档中的任何元素都属于命名空间:"http: //www.tei-c.org/ns/1.0"并且必须作为此命名空间中的节点进行访问.
解决方案:在XSLT代码中定义文档默认命名空间(这次使用绑定的前缀)并在指定每个名称时使用前缀.
这是产生所需结果的最简单,最短的转换之一:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.tei-c.org/ns/1.0">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="x:text/x:body//text()">
<xsl:value-of select="concat(.,'
')"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
应用于提供的XML文档时:
<TEI xmlns="http://www.tei-c.org/ns/1.0" n="Wright2-0034.sgml.xml">
<teiHeader type="text">
<fileDesc>
<titleStmt>
<title>Header Title</title>
</titleStmt>
<publicationStmt>
<p>Published</p>
</publicationStmt>
<sourceDesc>
<p>Sourced</p>
</sourceDesc>
</fileDesc>
</teiHeader>
<text>
<front> </front>
<body>
<head>THE TITLE</head>
<div type="chapter" part="N" org="uniform" sample="complete">
<head>CHAPTER I</head>
<p>Some text.</p>
</div>
</body>
</text>
</TEI>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
THE TITLE
CHAPTER I
Some text.
Run Code Online (Sandbox Code Playgroud)