4

一部の XML を csv ファイルに変換する XSLT スタイルシートが多数あります。使用される XML ファイルは、データベースの列名に基づいて生成されます。データベースの列名は、XML の構築時に自動的に大文字に変換されていましたが、これはできなくなりました (XML の構築に TSQL-FOR XML を使用していません)。列名は通常、大文字と小文字が混在しています。現在、すべてのスタイルシートが大文字の列名を参照しているため、XPath クエリは失敗しています。

すべての XSL スタイルシートを調べて、手動で XPath クエリをデータベース列名の大/小文字に変更する代わりに、これには今年のほとんどがかかります (!) すべての XML 'タグ' 名を大文字に変換する方法はありますか?ドキュメントで使用できますか?

どんな助けでも大歓迎です!!

ありがとう!アンドリュー

例: 以下は、「strName」my XML として XML に格納されている場合、xslt が「STRNAME」を探しているため、行に関する権利を持つ csv ファイルを生成しますが、データはありません。

<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 では、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>

この変換は、属性ではなく要素のみを「大文字」に変換します。2 番目のテンプレートの一致パターンを に変更するだけで、とにかく簡単に属性に拡張できます*|@*


以下のコメントと仕様によると、translate()関数はすべての言語で大文字と小文字を変換するのに十分なソリューションではありません。

于 2011-06-29T09:43:45.127 に答える
2

@empoのソリューションは、名前がラテン文字のみで構成されている場合に使用できるソリューションです。translate()そうでない場合は、@empoのソリューションの関数を標準のXPath2.0関数に置き換える同様のXSLT2.0変換を使用できますupper-case()

また、スタイルシートが数個しかない場合は、大文字と小文字が混在する名前を処理するようにスタイルシート自体を変更する方がはるかに簡単な場合があります。

あれは:

それ以外の

<xsl:template match="SOMENAME">

使用

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