我的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,我可以完全删除该字段,但是,这对我没有帮助。
有没有办法可以通过排除数字,如果它找到它,或者通过名称和时间段之间的空格来做到这一点?
任何见解都会很棒
感谢。
答案 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"
的所有="
。