在XSLT中省略一个数字

时间:2011-07-21 15:15:09

标签: xml regex xslt

我的xml的一部分我有文件:

<Global>
<GlobalParam name="RollName" value="Scene" 10:00:00:00" />
<GlobalParam name="TapeOrg" value="10:00:00:00" />
<GlobalParam name="ReadStart" value="00:00:00:00" />
<GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>  

目前我的XSL没有处理该字段中的任何内容,如下所示:

 <xsl:template match="GlobalParam">
    <GlobalParam>
        <xsl:attribute name="name">
            <xsl:value-of select="@name" />
        </xsl:attribute>
        <xsl:attribute name="value">
            <xsl:value-of select="@value" />
        </xsl:attribute>
    </GlobalParam>
</xsl:template>

这通常会很好但是,软件会在重新处理文件时输出它(如上所示,将10:00:00:00添加到文件名和XML文件中,我需要删除它们但是当我进行翻译时,我可以处理输出文件名。

我需要从卷名字段中删除10:00:00:00",但保持名称不变  但是我正在查看XSLT模式,我找不到合适的函数来处理这个问题。没有经验的XSLT,我可以完全删除该字段,但是,这对我没有帮助。

有没有办法可以通过排除数字,如果它找到它,或者通过名称和时间段之间的空格来做到这一点?

任何见解都会很棒

感谢。

2 个答案:

答案 0 :(得分:3)

正如评论中所写,您的输入文本不是格式良好的XML文档,可能应由您的提供者修复。对于临时修复,您可以使用一些外部工具, sed而不是XSLT。我并不是说你不能使用它(请查看this answer了解更多信息),但恕我直言,这对XSLT来说不够。

sed 's/ 10:00:00:00"//' input.xml

结果:

<Global>
    <GlobalParam name="RollName" value="Scene" />
    <GlobalParam name="TapeOrg" value="10:00:00:00" />
    <GlobalParam name="ReadStart" value="00:00:00:00" />
    <GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>

修改

这是基于XSLT 2.0的解决方案(在Saxon-HE 9.3上测试):

<强> stylesheet.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:variable name="input" select="unparsed-text('input.xml')"/>

    <xsl:template name="main">
        <xsl:analyze-string select="$input" regex=' 10:00:00:00"'>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>
</xsl:stylesheet>

input.xml(格式不正确):

<Global>
<GlobalParam name="RollName" value="Scene" 10:00:00:00" />
<GlobalParam name="TapeOrg" value="10:00:00:00" />
<GlobalParam name="ReadStart" value="00:00:00:00" />
<GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>

<强> CLI:

java -jar saxon9he.jar -it:main -xsl:stylesheet.xsl -o:output.xml

结果(output.xml):

<Global>
<GlobalParam name="RollName" value="Scene" />
<GlobalParam name="TapeOrg" value="10:00:00:00" />
<GlobalParam name="ReadStart" value="00:00:00:00" />
<GlobalParam name="ReadDuration" value="00:02:05:09" />
</Global>

答案 1 :(得分:1)

您需要对输入文件应用预处理。如果您使用的是.NET,则可以使用此代码删除10:00:00:00"

var result = Regex.Replace(input, @"(?s)(?<!=""\s*)10:00:00:00""", string.Empty);

正则表达式(?s)(?<!="\s*)10:00:00:00"会找到前缀中没有10:00:00:00"的所有="