0

名前空間「tns」の xml ファイルを取得しました。どこでも「tns」を使用せずにxsltを使用したいのですが、代わりにtns名前空間が一度宣言された一致するテンプレートを使用し、それを使用します。ルート tns:cv (xml) を自分のルート cv (xsl) に一致させたいのですが、xslt には何が問題なのですか?

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="multiLanguageToSingle.xslt"?>
<tns:cv xmlns:tns="http://www.i8c.be/CvService/1.0">
    <tns:generalLanguage>nl</tns:generalLanguage>
    <tns:careerPath>
        <tns:current>
            <tns:company language="nl">
                <tns:companyName></tns:companyName>
                <tns:description></tns:description>
            </tns:company>
        </tns:current>
        <tns:former>
            <tns:company language="nl">
                <tns:companyName></tns:companyName>
                <tns:description></tns:description>
            </tns:company>
        </tns:former>
    </tns:careerPath>
    <tns:companyDetails>
        <tns:address>

上記の xml (最初の数行) に xsl を使用したい:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://www.i8c.be/CvService/1.0">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
    <xsl:template match="/">
    <xsl:apply-templates select="/tns:cv" />
  </xsl:template>

<xsl:template match="/tns:cv">
<cv xsi:schemaLocation="http://www.i8c.be/CvService/1.0 cvDataTemplate.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:variable name="language" select='"nl"'/>
    <careerPath>
        <current>
        <xsl:for-each select="cv/careerPath/current/company[@language=$language]">
            <companyName><xsl:value-of select="companyName"/></companyName>
            <description><xsl:value-of select="description"/></description>
        </xsl:for-each>
        </current>

        <former>
        <xsl:for-each select="cv/careerPath/former/company[@language=$language]">
            <companyName><xsl:value-of select="companyName"/></companyName>
            <description><xsl:value-of select="description"/></description>
        </xsl:for-each>
        </former>
    </careerPath>
4

1 に答える 1

1

名前空間について理解しておくべき重要なことは、XML ファイルの名前空間は実際には問題ではないというtnsことです。これは、実際の名前空間のファイル ローカル名/省略形、つまりhttp://www.i8c.be/CvService/1.0. ここで、xslt ファイルで同じ略語を選択しました (読みやすくするためには理にかなっていますが、ツールに関する限り、完全にオプションです)。したがって、何かに一致することは期待できません。これには、次cv/careerPath/current/company[@language=$language]の 2 つの理由があります。

  • careerPathXML ファイルのデフォルトの名前空間に要素がありません。それは である必要がありtns:careerPath、XPath 文字列の他のコンポーネントについても同様です。
  • 最上位の要素がすでにコンテキストノードになっている一致を求めています。これtns:cvは、一致の内側にいるという理由によるxsl:tenplateものです。そのノードには子が含まれていないため、cvで始まる XPathcv/は空のノード セットになります。

したがって、cv/クエリの先頭にある を削除し、次のいずれかを行います

  • 名前空間修飾子を追加するか、
  • XSLT ファイルのデフォルトの名前空間を変更するには、xmlns="http://www.i8c.be/CvService/1.0"十分に離れた要素を配置します。(これは、出力の修飾されていない要素名にも影響することに注意してください。)
于 2012-05-08T12:33:00.820 に答える