4

次のように出力されるデータのテーブルを表す XML 出力があります。

<results>
  <Row1.Name>Henry</Row1.Name>
  <Row1.Id>P162</Row1.Id>
  <Row1.Age>23</Row1.Age>
  <Row2.Name>John</Row2.Name>
  <Row2.Id>P137</Row2.Id>
  <Row2.Age>27</Row2.Age>
  <Row3.Name>Mary</Row3.Name>
  <Row3.Id>L493</Row3.Id>
  <Row3.Age>32</Row3.Age>
</results>

そして、私はそれをこれに変換したい:

<results>
  <Row>
    <Name>Henry</Name>
    <Id>P162<Id>
    <Age>23</Age>
  </Row>
  <Row>
    <Name>John</Name>
    <Id>P137<Id>
    <Age>27</Age>
  </Row>
  <Row>
    <Name>Mary</Name>
    <Id>L493<Id>
    <Age>32</Age>
  </Row>
</results>

私が使用しているアプリケーションでは、XSLT 1.0 を使用する必要があります。これは非常に単純なことだと思いますが、今日はメンタル ブロックがあるので、仮想の同僚に尋ねてみようと思いました。

誰かアイデアはありますか?

注:必要な出力を修正して、反復行番号を表示しないようにしました。これは私が望むものです。

まだ機能に近いものはありません。まだまだ色々と遊んでいます。

私はこのようなものを書くことができると思った:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <xsl:variable name="Row" select="distinct-values(*[contains(name(),'Row')])" />
           <xsl:for-each select="$Row">
               <xsl:variable name="rowName" select="name()" />
               <Row>
                   <xsl:for-each select="*[contains(name(),$Row)]">
                       <xsl:copy select="." />
                   </xsl:for-each>
               </Row>
           </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

これを生成するには:

<results>
    <Row>
        <Row1.Name>Henry</Row1.Name>
        <Row1.Id>P162</Row1.Id>
        <Row1.Age>23</Row1.Age>
    </Row>
    <Row>
        <Row2.Name>John</Row2.Name>
        <Row2.Id>P137</Row2.Id>
        <Row2.Age>27</Row2.Age>
    </Row>
    <Row>
        <Row3.Name>Mary</Row3.Name>
        <Row3.Id>L493</Row3.Id>
        <Row3.Age>32</Row3.Age>
   </Row>
</results>

次に戻って、すべての Row# プレフィックスを次のように削除します。

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

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*[contains(name(),'.')]">
        <xsl:variable name="Name" select="substring-after(name(),'.')" />
        <xsl:element name="{$Name}">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

distinct-valuesただし、どちらの変換も機能せず、XSLT 1.0では使用できないと思います

4

1 に答える 1