2017-12-15 5 views
2

私はXSLTの新機能ですので、これは本当にシンプルですが、私はそれを得ることができません。私は単純なxmlに出力されたレポートをパイプで区切られたファイルに変換しようとしています。 for-eachの中から呼び出されたテンプレートの中からwd:SSNにアクセスする方法を理解できません。レポートからのxml出力は次のようになります。for-each内から呼び出されたテンプレート内のノードへのアクセス

<wd:Report_Data xmlns:wd="urn:com.workday.report/Report_ABC"> 
    <wd:Report_Entry> 
    <wd:Company> 
     <wd:Company_Code>123</wd:Company_Code> 
    </wd:Company> 
    <wd:Employee_Last_Name>Smith</wd:Employee_Last_Name> 
    <wd:Employee_First_Name>Joe</wd:Employee_First_Name> 
    <wd:SSN>123456789</wd:SSN> 
    <wd:Street_Address>123 First St</wd:Street_Address> 
    <wd:City>Colorado Springs</wd:City> 
    <wd:State_Province>CO</wd:State_Province> 
    <wd:ZIP_Code>80927</wd:ZIP_Code> 
    </wd:Report_Entry> 
    <wd:Report_Entry> 
    <wd:Company> 
     <wd:Company_Code>123</wd:Company_Code> 
    </wd:Company> 
    <wd:Employee_Last_Name>Smith</wd:Employee_Last_Name> 
    <wd:Employee_First_Name>Sally</wd:Employee_First_Name> 
    <wd:SSN>123456790</wd:SSN> 
    <wd:Street_Address>123 First St</wd:Street_Address> 
    <wd:City>Colorado Springs</wd:City> 
    <wd:State_Province>CO</wd:State_Province> 
    <wd:ZIP_Code>80927</wd:ZIP_Code> 
    </wd:Report_Entry> 

その後、私のコードでは、あなたの助けのために、この

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:strip-space elements="*"/> 
<xsl:output method="text" indent="no"/> 
<xsl:template match="wd:Report_Data" xmlns:wd="urn:com.workday.report/Report_ABC"> 

    <!-- Loop thru employee records for Company 123 --> 
    <xsl:for-each select="wd:Report_Entry[wd:Company/wd:Company_Code = '123']"> 
    <xsl:call-template name="ProcessCompanyEmployee"/>  
    </xsl:for-each> 
</xsl:template> 

<!-- Process Company Employee --> 
<xsl:template name="ProcessCompanyEmployee"> 
<!-- EMP Employee Record --> 
    <xsl:text>EMP|N|N</xsl:text> 
    <xsl:text>|</xsl:text> 
    <xsl:text>|</xsl:text> 
    <xsl:value-of select="wd:SSN"/> 
    <xsl:text>||</xsl:text> 
    <xsl:call-template name="insertNewLine"/> 
</xsl:template> 

おかげのように見えます!

+0

申し訳ありませんが、私はWD置くことを忘れていました:XMLの会社ノードを、私はそのノードを含むように更新。私が抱えている問題は、wd:SSNにアクセスすることです。私はそれを直接for-eachに持っていればうまく動作します。しかし、従業員を処理するためのコードの部分は実際には600行以上であり、複数の企業でそれを実行する必要があるため、ProcessCompanyEmployeeテンプレートに分割します。私がそれをするとき、それはwd:SSNがもう嫌いです。私は、wd:SSNなどのフィールドを別の方法で参照する必要があると仮定しますが、それは何か分かりません。それが私の問題をより良く説明してくれるでしょうか – RDay

+0

ああ...私はもっと読んでいます。コンテキストを提供するために、私のProcessCompanyEmployeeテンプレートに一致パターンが必要なように聞こえるかもしれませんが、どうしたらよいかわかりません。私はwdを試しました:Report_Entry、私はwdを試みました:Report_Data/wd:Report_Entry、どちらも動作しません。 – RDay

+0

期待される出力は?私はあなたの* insertNewLine *テンプレートをスタイルシートのどこでも定義されていない ' '(改行)に置き換え、 'xmlns:wd ...'をルートタグに移動しました。パイプで区切られた出力でエラーは現れませんでした。あなたの問題が何であるか不明です。 – Parfait

答えて

1

名前空間を1つのxsl:テンプレートにバインドするだけでなく、別のxsl:テンプレートでも使用しようとしています。

xmlns:wd宣言をxsl:stylesheetまで移動してみてください。

例...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:wd="urn:com.workday.report/Report_ABC"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="text" indent="no"/> 

    <xsl:template match="wd:Report_Data"> 
    <!-- Loop thru employee records for Company 123 --> 
    <xsl:for-each select="wd:Report_Entry[wd:Company/wd:Company_Code = '123']"> 
     <xsl:call-template name="ProcessCompanyEmployee"/>  
    </xsl:for-each> 
    </xsl:template> 

    <!-- Process Company Employee --> 
    <xsl:template name="ProcessCompanyEmployee"> 
    <!-- EMP Employee Record --> 
    <xsl:text>EMP|N|N</xsl:text> 
    <xsl:text>|</xsl:text> 
    <xsl:text>|</xsl:text> 
    <xsl:value-of select="wd:SSN"/> 
    <xsl:text>||</xsl:text> 
    <xsl:call-template name="insertNewLine"/> 
    </xsl:template> 

    <xsl:template name="insertNewLine"> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

また、あなたは、XSLT 2.0を使用していることから、あなたのXPathの中ですべての接頭辞を使用することができなかったし、追加します。

xpath-default-namespace="urn:com.workday.report/Report_ABC" 

をXSLに:スタイルシート。

例...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="urn:com.workday.report/Report_ABC"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="text" indent="no"/> 

    <xsl:template match="Report_Data"> 
    <!-- Loop thru employee records for Company 123 --> 
    <xsl:for-each select="Report_Entry[Company/Company_Code = '123']"> 
     <xsl:call-template name="ProcessCompanyEmployee"/>  
    </xsl:for-each> 
    </xsl:template> 

    <!-- Process Company Employee --> 
    <xsl:template name="ProcessCompanyEmployee"> 
    <!-- EMP Employee Record --> 
    <xsl:text>EMP|N|N</xsl:text> 
    <xsl:text>|</xsl:text> 
    <xsl:text>|</xsl:text> 
    <xsl:value-of select="SSN"/> 
    <xsl:text>||</xsl:text> 
    <xsl:call-template name="insertNewLine"/> 
    </xsl:template> 

    <xsl:template name="insertNewLine"> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

完璧!ダニエルありがとう!それが私の問題を解決しました!感謝します!私はあなたの最後の声明を理解するのに十分なものではありませんが、私のコードは動作しているので、私は今は良いと思っています。 – RDay

+0

@RDay - ようこそ!最後の声明で私が何を言っているかを説明するための例も加えました。基本的には、xpathsから接頭辞を付けた 'wd:'をすべて取り除き、xsl:stylesheetの 'xmlns:wd'を' xpath-default-namespace'に変更しました。これは、大部分のXPathが同じ名前空間内の要素/属性を指す大きなスタイルシートで、XPathをよりクリーンにします。 –

0

for-each selectには[wd:Company/wd:Company_Code = '123']がありますが、XMLにはwd:Company要素が含まれていません。

<xsl:template match="wd:Report_Data"> 
    <xsl:for-each select="wd:Report_Entry[wd:Company_Code = '123']"> 

XSLTをテストするとき、それはテンプレートの使用を削減し、取得するのに役立ちます:

次のテンプレートは、あなたのXMLを変換するために動作します:作品も次のように

<xsl:template match="/"> 
    <xsl:for-each select="//wd:Report_Entry[wd:Company_Code = '123']"> 
     <xsl:text>EMP|N|N</xsl:text> 
     ... 
     <xsl:value-of select="wd:SSN"/> 
     ... 
    </xsl:for-each> 
</xsl:template> 

あなたのオリジナルマッチを使うには、/を選択しますそれは1つの要素(例えばSSN)を選択し、そこからバックアップを作成するように動作します。

+0

申し訳ありませんが、wd:companyノードをxmlに入れるのを忘れていました。ノードを含めるように更新しました。私が抱えている問題は、wd:SSNにアクセスすることです。私はそれを直接for-eachに持っていればうまく動作します。しかし、従業員を処理するためのコードの部分は実際には600行以上であり、複数の企業でそれを実行する必要があるため、ProcessCompanyEmployeeテンプレートに分割します。私がそれをするとき、それはwd:SSNがもう嫌いです。私は、wd:SSNなどのフィールドを別の方法で参照する必要があると仮定しますが、それは何か分かりません。それが私の問題をより良く説明してくれるでしょうか – RDay

+0

私は 'xmlns:wd =" urn:com.workday.report /Report_ABC "'を 'xsl:stylesheet'要素に置くか、あるいは両方のテンプレート宣言で動作させました。ダニエル・ヘイリーの答えは、私が言っている最も正しい答えです。 – Geoff

+1

ありがとうございましたGeoff!あなたとダニエル・ヘイリーの考えは私の問題を解決しました。ダニエルは速く走っていて、あなたが言ったように、コード内の1か所にしか存在しないので、おそらく良いでしょう。 – RDay

関連する問題