3

我想删除空格并返回元素之间仅针对特定子元素(即)的“数学”,如下面的 XML 所述。我试过了<xsl:strip-space elements="m:math"/>。但它删除了所有元素的空间。我需要保留<style>元素之后的空间和元素之前的空间<b>

输入 XML:

<?xml version="1.0"?>
<chapter xmlns="http://www.w3.org/1998/Math/MathML">
    <style>This is style</style> 
    <math display="block"> 
        <munder> 
            <mi mathvariant="normal">BASE</mi>
            <mi mathvariant="normal">under</mi> 
        </munder> 
        <mo>=</mo> 
        <munder> 
            <mrow> 
                <munder> 
                    <mi mathvariant="normal">BASE</mi> 
                    <mi mathvariant="normal">under</mi> 
                </munder> 
            </mrow> 
            <mphantom>
                <mi mathvariant="normal">under</mi>
            </mphantom> 
        </munder> 
    </math>
    <b>This is bold</b>
</chapter>

XSLT 试过:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML">
    <xsl:output method="xml" encoding="UTF-8" indent="no"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

所需输出:

<?xml version='1.0' encoding='UTF-8'?>
<chapter xmlns="http://www.w3.org/1998/Math/MathML"><style>This is style</style> <math display="block"><munder><mi mathvariant="normal">BASE</mi><mi mathvariant="normal">under</mi></munder><mo>=</mo><munder><mrow><munder><mi mathvariant="normal">BASE</mi><mi mathvariant="normal">under</mi></munder></mrow><mphantom><mi mathvariant="normal">under</mi></mphantom></munder></math> <b>This is bold</b></chapter>
4

2 回答 2

2

编辑:虽然这个答案对这个问题无效,但我保留它以供参考,因为我已经解释了linearize XML代码中每个模板的重要性..并将相关答案作为新答案发布..


你不需要剥离空间,这应该做..

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="no" omit-xml-declaration="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space()" />
    </xsl:template>
</xsl:stylesheet>

解释:

<xsl:output indent="no" omit-xml-declaration="yes"/>

indent = 'no' 负责删除两个节点之间的附加空间 .. omit-xml-declaration从输出 XML 中删除 xml 声明。在您的情况下这是可选的..

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

按原样复制节点.. 除了没有缩进..

<xsl:template match="text()">
    <xsl:value-of select="normalize-space()" />
</xsl:template>

将不需要的空白字符转换为单空格字符 .. 示例:

<node>

    there is lots of     space
</node>

输出将是这样的:

<node>there is lots of space</node>
于 2013-04-17T06:24:47.753 回答
1

诀窍是插入 <xsl:text>&#xA0;</xsl:text>任何你想要的地方..

在这里,我&#xA0;在复制节点下的每个元素之前插入此文本(引入空间)chapter

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="no" omit-xml-declaration="no"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="//*[parent::node()[name() = 'chapter']]">
    <xsl:text>&#xA0;</xsl:text>
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space()" />
    </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?><chapter xmlns="http://www.w3.org/1998/Math/MathML"> <style>This is style</style> <math display="block"><munder><mi mathvariant="normal">BASE</mi><mi mathvariant="normal">under</mi></munder><mo>=</mo><munder><mrow><munder><mi mathvariant="normal">BASE</mi><mi mathvariant="normal">under</mi></munder></mrow><mphantom><mi mathvariant="normal">under</mi></mphantom></munder></math> <b>This is bold</b></chapter>

您可以根据需要修改条件以容纳额外的空间。

于 2013-04-17T07:05:42.073 回答