1

単純なキー値構造を持つデータ セット (制御できない) があります。n 行を持つテーブルにデータが入力されている場合、出力のサンプルは次のようになります。

<property>
  <name>Row1_Field1</name>
  <value>Data Value Sample</value>
</property>
<property>
  <name>Row1_Field2</name>
  <value>Data Value Sample</value>
</property>
<property>
  <name>Row2_Field1</name>
  <value>Data Value Sample</value>
</property>
<property>
  <name>Row2_Field2</name>
  <value>Data Value Sample</value>
</property>

XSLT を使用して、これを以下の例のように扱いやすいものに変換することは可能ですか?

<rows>
  <row>
    <Field1>Data Value Sample</Field1>
    <Field2>Data Value Sample</Field2>
  </row>
  <row>
    <Field1>Data Value Sample</Field1>
    <Field2>Data Value Sample</Field2>
  </row>
</rows>
4

1 に答える 1

2

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <rows>
      <xsl:apply-templates/>
     </rows>
 </xsl:template>

 <xsl:template match=
  "property[not(substring-before(name,'_')
               =
                substring-before(preceding-sibling::*[1]/name,'_'))]">
  <row>
    <xsl:apply-templates mode="inRow" select=
     "/*/property[substring-before(name,'_') = substring-before(current(),'_')]"/>
  </row>
 </xsl:template>

 <xsl:template match="property" mode="inRow">
  <xsl:element name="{substring-after(name,'_')}"><xsl:value-of select="value"/></xsl:element>
 </xsl:template>
 <xsl:template match="property"/>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<properties>
    <property>
        <name>Row1_Field1</name>
        <value>Data Value Sample</value>
    </property>
    <property>
        <name>Row1_Field2</name>
        <value>Data Value Sample</value>
    </property>
    <property>
        <name>Row2_Field1</name>
        <value>Data Value Sample</value>
    </property>
    <property>
        <name>Row2_Field2</name>
        <value>Data Value Sample</value>
    </property>
</properties>

必要な正しい結果が生成されます。

<rows>
   <row>
      <Field1>Data Value Sample</Field1>
      <Field2>Data Value Sample</Field2>
   </row>
   <row>
      <Field1>Data Value Sample</Field1>
      <Field2>Data Value Sample</Field2>
   </row>
</rows>
于 2013-01-18T00:28:45.373 に答える