我有很多 XSLT 样式表,可以将一些 XML 转换为 csv 文件。 使用的 XML 文件是根据数据库列名生成的,这些列名过去在构建 XML 时会自动转换为大写 - 现在不能再这样做了(我们没有使用 TSQL-FOR XML 来构建 XML)。列名通常是大写和小写字母的混合。 由于所有样式表当前都引用大写列名称,因此 XPath 查询失败。
与其遍历所有 XSL 样式表并手动将 XPath 查询更改为数据库列名的大小写——这将花费今年的大部分时间(!) 有没有办法将所有 XML“标记”名称转换为大写,以便您可以在文档中使用它们?
非常感谢任何帮助!!
谢谢! 安德鲁
一个例子: 下面将生成一个 csv 文件,其中包含正确的行,但没有任何数据,因为 xslt 正在寻找“STRNAME”,当它作为“strName”存储在 XML 中时 我的 XML:
<XMLWRAPPER>
<STAFFTABLE>
<ROW>
<strName>Andrew</strName>
<strSurname>Smith</strSurname>
<intuserType>1</intUserType>
</ROW>
<ROW>
<strName>Jackie</strName>
<strSurname>collins</strSurname>
<intuserType>2</intUserType>
</ROW>
</STAFFTABLE>
</XMLWRAPPER>
和 xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">"First Name","Surname","User type"<xsl:text>
</xsl:text>
<xsl:for-each select="/XMLWRAPPER/STAFFTABLE/ROW">
<xsl:value-of select="STRNAME"/>,<xsl:value-of select="STRSURNAME"/>,<xsl:value-of select="INTUSERTYPE"/><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
最佳答案
在 XSLT 1.0 中,我会使用 Identity Transformation和 translate()
功能:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{
translate(name(.),
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这个转换只会“大写”元素,而不是属性。只需将第二个模板的匹配模式更改为 *|@*
即可轻松将其扩展到属性。
根据下面的评论和 specs , translate()
函数并不是所有语言中大小写转换的充分解决方案。
关于xml - 将 XML 节点名称转换为大写 (XSLT 1.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518268/