1

XML のすべての子要素をループし、それらの属性を 1 つの出力要素にプッシュする XSL-T があります。ただし、これらの子要素には重複する属性があり (複数の子要素に同じ属性があります)、XSL はそれぞれに対して 1 つの結果しか提供していません (ファミリー内のその属性の値の 1 つのみ)。また、子のすべての子を探して、これらを結果の属性セットに適切にプッシュしているとは思いません。

私は単一の動的 XSL-T を使用してみました。また、N# XSL テンプレートを使用して、それぞれが単一の子要素に特に焦点を当て、子要素の名前を出力された属性にハードコーディングしてみました。最初のテンプレートの結果が得られたため、問題は解決しませんでした。私の2番目のアプローチが機能するように修正できれば、それで問題ありません。プログラムでこれを動的に行う方法 (最初のオプション) があれば、本当に素晴らしいです! XSL は強力なので、うまくいけばこれが可能になり、皆さんも支援できるでしょう!

以下は、私の XML ドキュメントのような形をした例です。

<JSON offset="0" total_rows="1337" millis="987">
<rows Attribute1="" Attribute2="" oid="0000001">
<Name Attribute1="FirstName" Attribute2="LastName">
<_id oid="1337"/>
</Name>
<Occupation oid="12345"/>
</rows>
</JSON>

親要素と子要素の間に重複する属性があることに注意してください。動的コードまたはハードコーディングされたアプローチを使用して、これらの属性のセットを 1 つしか取得できません。また、どちらのアプローチでも行の子の子を取得しようとしているかどうかはわかりません。動作していないため、確認できませんでした。

私の 2 つの XSL アプローチ:

動的 (重複する属性に対して 1 つの値のみを返します):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="JSON">
<DATAPARENT>
<xsl:apply-templates/>
</DATAPARENT>
</xsl:template>
<xsl:template match="//rows">

        <xsl:element name="DataRow">
        <xsl:for-each select="*">                   

                    <xsl:for-each select="@*">  

                    <xsl:attribute name="{name()}">  

                        <xsl:value-of select="." />  

                    </xsl:attribute>

                    </xsl:for-each> 

        </xsl:for-each>
        </xsl:element>
        <xsl:text>&#10;</xsl:text>


</xsl:template>
</xsl:stylesheet>

ハードコーディング (柔軟性が低く、問題ありませんが、rows_{name()} を使用した最初の結果セット以外は何も提供しません):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="JSON">
<DATAPARENT>
<xsl:apply-templates/>
</DATAPARENT>
</xsl:template>

<xsl:template match="/rows">

        <xsl:element name="DataRow">            

                    <xsl:for-each select="@*">  

                    <xsl:attribute name="rows_{name()}">  

                        <xsl:value-of select="." />  


                    </xsl:attribute>

                    </xsl:for-each> 

        </xsl:element>  

</xsl:template>

<xsl:template match="//Name">

        <xsl:element name="DataRow">            

                    <xsl:for-each select="@*">  

                    <xsl:attribute name="Name_{name()}">  

                        <xsl:value-of select="." />  


                    </xsl:attribute>

                    </xsl:for-each> 

        </xsl:element>  

</xsl:template>

<xsl:template match="//Occupation">

        <xsl:element name="DataRow">            

                    <xsl:for-each select="@*">  

                    <xsl:attribute name="Occupation_{name()}">  

                        <xsl:value-of select="." />  


                    </xsl:attribute>

                    </xsl:for-each> 

        </xsl:element>  

</xsl:template>

</xsl:stylesheet>

提供できる提案と洞察に感謝します。要素属性のループを行う基本的なアプローチを提案する前に、私が既に提供した XSL を見てください。私はすでにそれらを使用していますが、解決していない重複属性の問題です。ありがとう!!

**編集: 望ましい出力は次のようになります。

<DATAPARENT>
<DataRow rows_Attribute1="" rows_Attribute2="" rows_oid="0000001" Name_Attribute1="FirstName" Name_Attribute2="LastName" Name__id_oid="1337" Occupation_oid="12345" />
<DataRow rows_Attribute1="1" rows_Attribute2="2" rows_oid="0000002" Name_Attribute1="FirstName" Name_Attribute2="LastName" Name__id_oid="1254" Occupation_oid="99231" />
</DATAPARENT>**

XML で重複した名前付き属性を使用できないことは認識していますが、ソース内の要素を参照する一意の組み合わせで属性名をプログラムで作成する方法がわかりません。

4

2 に答える 2

0

最初:最初のサンプルでは、​​のすべての子のすべての属性を、同じ名前のrows1つの要素の属性として書き出しています。DataRowXMLでは要素に任意の名前の属性が1つしか許可されていないため、(子の間にその名前の属性が複数ある場合でも)任意の名前の属性を1つだけ取得します。スタイルシートがXML出力を生成する場合、出力DataRows要素は1つの属性を持つことができますが、2つを持つことはできません。oid

サブツリーの属性と値のペアごとに1つの名前と値のペアが必要な場合はDataRow、属性ではなく、の子として書き出します。

次に:子孫ではなく子を反復処理するrowsため、の孫(またはその子孫)から属性を取得していません。xsl:for-eachfor-eachをapply-templatesとして、おそらくモード(繰り返しが簡単になり、一部のXSLTプログラマーがより慣用的に感じる)で書き直すか、に変更select="*"することができます"select="descendant::*"

于 2012-09-22T21:14:30.773 に答える
0

希望する出力は表示されていませんが、同じ名前の複数の属性を持つ要素を作成しようとしているように見えます。これは XML では許可されていないため、XSLT では許可されていません。

同じ要素に同じ名前の 2 つの属性を追加しようとすると、XSLT は最後に追加されたものを取ります。XQuery がエラーを報告します。

于 2012-09-23T07:33:39.827 に答える