4

我有许多将一些 XML 转换为 csv 文件的 XSLT 样式表。使用的 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>&#013;</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>&#013;</xsl:text>
     </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
4

2 回答 2

4

在 XSLT 1.0 中,我将使用身份转换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>

此转换将仅“大写”元素,而不是属性。无论如何,只需将第二个模板的匹配模式更改为*|@*.


根据下面的评论和规范translate()函数不是所有语言中大小写转换的充分解决方案。

于 2011-06-29T09:43:45.127 回答
2

@empo 的解决方案是在名称仅包含拉丁字符的情况下可以使用的解决方案。如果不是这种情况,可以使用类似的 XSLT 2.0 转换,将translate()@empo 解决方案中的函数替换为标准 XPath 2.0 函数upper-case()

此外,如果您只有几个样式表,则修改样式表本身以处理混合大小写的名称可能会容易得多:

那是:

代替

<xsl:template match="SOMENAME">

使用

 <xsl:template 
   match="*['SOMENAME' = translate(., $Lowercase, $Uppercase)]">
于 2011-06-29T12:55:56.983 回答