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