12

XSLT を使用して Web ページの Excel シートに変換される XML があります。XML の要素タグは、Excel の列ヘッダーになります。スペースが必要な列があります。Excel シートのヘッダーにアンダースコアやハイフンが含まれることは好ましくありません。XML タグ/要素にスペースを組み込むにはどうすればよいですか?  or %20or #&20;etc. (すべての種類の構文) を入れてみましたが、XML エディター自体に、この 16 進数文字は許可されていないというエラーが表示されます。

私のXMLは

<ClientArray>
  <Client>
    <LastName>Aanonsen</LastName>
    <FirstName>Fred</FirstName>
    <Additional Remarks><Additional Remarks>
  </Client>

タグのAdditionalとの間にスペースが必要です。Remarks助けてください。前もって感謝します。

4

2 に答える 2

19

XML タグ/要素にスペースを組み込むにはどうすればよいですか? or %20 とか &#20;etc とか入れてみました。(すべての種類の構文)しかし、それらのすべてがxmlエディター自体にエラーを表示し、この16進文字は許可されていないことを示しています

できませんW3C XML 仕様では、名前の構文が厳密に定義されています。名前は英字 (アンダースコアを含む) でのみ開始でき、次の文字は英字、数字、またはハイフンにすることができますが、スペースは区切り文字であり、名前の一部として使用することはできません。

より正確には、仕様の正確なルールは次のとおりです。

[4a]    NameChar    ::=    NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] 
[5]    Name    ::=    NameStartChar (NameChar)* 

この制限を克服するには、XSLT 変換を変更して、XML 名より文字列を読みやすい Excel 列名として出力するようにする必要があります。

于 2010-08-13T22:10:19.823 に答える
4

Dimitre の正確な答えに加えて、次のスタイルシートのようなパターンを使用できます。

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="Client/*" name="space-capital">
        <xsl:param name="pLetters"
                   select="translate(name(),'qwertyuiopasdfghjklzxcvbnm','')"/>
        <xsl:param name="pString" select="name()"/>
        <xsl:param name="pOut" select="''"/>
        <xsl:choose>
            <xsl:when test="$pString != ''">
                <xsl:variable name="vFirst" select="substring($pString,1,1)"/>
                <xsl:call-template name="space-capital">
                    <xsl:with-param name="pLetters" select="$pLetters"/>
                    <xsl:with-param name="pString"
                                               select="substring($pString,2)"/>
                    <xsl:with-param name="pOut"
                         select="concat($pOut,
                                        substring(' ',1,contains($pLetters,
                                                                 $vFirst)
                                                        and
                                                        $pOut != ''),
                                        $vFirst
                                       )"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat($pOut,' : ',.,'&#xA;')"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

この適切な入力で:

<ClientArray>
  <Client>
    <LastName>Aanonsen</LastName>
    <FirstName>Fred</FirstName>
    <AdditionalRemarks>Something</AdditionalRemarks>
  </Client>
</ClientArray>

出力:

Last Name : Aanonsen
First Name : Fred
Additional Remarks : Something

XPath 2.0 では:

string-join(/*/*/*/concat(
                (: This is the expression you need :)
                     replace(name(),
                             '(\P{Lu})(\p{Lu})',
                             '$1 $2'),
              (: the rest is just to mimic the result :)
                     ' : ',.),
            '&#xA;')
于 2010-08-14T17:05:24.290 に答える