XSLT正在将我的十六进制属性转换为其他属性,如何阻止它?
我正在尝试将一个xml文件转换为输出另一个xml文件,我需要将属性“account”以与下面显示的相同的方式输出。我在文件中有很多这样的值,大多数都不起作用 对于类似0x0406的帐户值,其输出为0.0.06。但是对于像0x002d这样的值,它将它们单独保留,它们以我想要的方式出现 有什么想法吗 初始XML:XSLT正在将我的十六进制属性转换为其他属性,如何阻止它?,xslt,hex,Xslt,Hex,我正在尝试将一个xml文件转换为输出另一个xml文件,我需要将属性“account”以与下面显示的相同的方式输出。我在文件中有很多这样的值,大多数都不起作用 对于类似0x0406的帐户值,其输出为0.0.06。但是对于像0x002d这样的值,它将它们单独保留,它们以我想要的方式出现 有什么想法吗 初始XML: <?xml version="1.0" encoding="UTF-8"?> ... <foo account="0x0406" other-stuff="blah" s
<?xml version="1.0" encoding="UTF-8"?>
...
<foo account="0x0406" other-stuff="blah" something-name="blah again"/>
...
...
...
这是我的xslt模板:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://some-internal-thing/user">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
...
<xsl:attribute name="account"><xsl:value-of select="@account"/></xsl:attribute>
...
...
...
能否尝试更改编码?例如,“ASCII”而不是“UTF-8”。无法再现所述问题
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://some-internal-thing/user">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:attribute name="account"><xsl:value-of select="@account"/></xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我使用10个不同的xslt处理器(Msxml3、Msxml4、Msxml6、.NET XslTransform、.NET XslCompiledTransform、AltovaXml(用于xslt 1.01.0)、Saxon 6.5.4、Saxon 9.1.07、Saxon 9.1.07.NET和XML-SPY-XSLT2.0)运行了以下转换,它们都产生了相同的正确结果
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://some-internal-thing/user">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:attribute name="account"><xsl:value-of select="@account"/></xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
对以下XML文档执行此转换时:
<?xml version="1.0" encoding="UTF-8"?>
<foo account="0x0406" other-stuff="blah" something-name="blah again"/>
<foo account="0x0406" />
生成预期的正确结果:
<?xml version="1.0" encoding="UTF-8"?>
<foo account="0x0406" other-stuff="blah" something-name="blah again"/>
<foo account="0x0406" />
如果您的XSLT处理器不是其中之一,并且您确实得到了错误的结果,那么这是一个错误,应该向供应商报告。这听起来很奇怪。XSLT应该始终将属性值作为普通字符串处理,除非被告知执行其他操作。我认为错误不在您粘贴的部分。这听起来不对,您能给我们一个完整(小)的示例和一步一步的说明来重现该结果吗?还请提及您使用的XSLT实现。我尝试用xsltproc和saxon测试了这一点,但没有发生。您能否发布一个完整的示例XML/XSLT对,而不是我必须修改才能使用的这些缩写对?感谢大家确认这与XSLT无关-在之前的过程中,我使用sed替换了XML文件中的文字字符串0.0.0,但没有使用,所以它取代了任何与正则表达式匹配的东西,并在我没有意识到的情况下弄乱了我的属性。人们仍然使用ASCII?或者干脆从源XML声明中删除编码,让XSLT引擎检测。也许你的源文件不是UTF-8。我不能尝试ASCII,我的xml文件中有unicode字符,我在尝试ASCII时出错。哇,10个不同的XSLT处理器-我希望我有这样的时间。感谢您的确认,它让我看到了除XSLT之外的所有内容,结果是我在之前的过程中接触了XML文件,并替换了文本字符串0.0.0(当然没有引用),因此它替换了正则表达式。我讨厌继承代码。@wonderfulthunk:我很高兴这有帮助。信不信由你,这只花了我2-3分钟。我使用的是一个XSLT IDE,它允许只需单击一两下就可以对任何XSLT处理器(已经安装)执行任何转换。