2

私は次のxmlを持っています:

<Root>    
        <Item>
          <CityCode>ALV</CityCode>
          <AirportCode>ALV</AirportCode>
          <CityName>ANDORRA LA VELLA</CityName>
          <AirportName>Andorra La Vella Hlpt</AirportName>
          <StateCode></StateCode>
          <CountryCode>AD</CountryCode>
          <AirportTypeCode>8</AirportTypeCode>
          <AirportTypeName>Heliport, not scheduled</AirportTypeName>    
       </Item>       
</Root>

これを取得するにはxsltが必要です:

<Root>
   <Item>
     <CityCode>ALV</CityCode>
     <CityName>ANDORRA LA VELLA</CityName>
     <CityNameComplete> ANDORRA LA VELLA (ALV) - Andorra La Vella Hlpt </CityNameComplete>
   <Item>
<Root>

最初の 2 つのノードを取得する方法は知っていますが、最後のノードを「挿入」する方法はわかりません。

4

3 に答える 3

1

これを完全なXSLTに埋め込むにはさまざまな方法がありますが、この要素を元のXmlドキュメント<CityNameComplete>の要素の代わりと見なすとしましょう。<AirportName>

次に、重要なのはXSLTの<value-of>要素です。

<xsl:template match="/Root/Item/AirportName">
    <CityNameComplete><xsl:value-of select="../CityName"/> (<xsl:value-of select="../AirportCode"/>) - <xsl:value-of select="."/></CityNameComplete>
</xsl:template>

これにより、

<CityNameComplete>ANDORRA LA VELLA (ALV) - Andorra La Vella Hlpt</CityNameComplete>

結果の要素。

更新:完全な都市名の周りに空白が本当に必要な場合<xsl:text> </xsl:text>は、スタイルシートに追加してください。

<xsl:template match="/Root/Item/AirportName">
    <CityNameComplete><xsl:text> </xsl:text><xsl:value-of select="../CityName"/> (<xsl:value-of select="../AirportCode"/>) - <xsl:value-of select="."/><xsl:text> </xsl:text></CityNameComplete>
</xsl:template>

結果:

<CityNameComplete> ANDORRA LA VELLA (ALV) - Andorra La Vella Hlpt </CityNameComplete>

アップデート2: IATAコードが含まれています。

更新3:ノードを挿入するための代替ソリューションは、<Item>要素のテンプレートにノードを追加することです。

<xsl:template match="/Root/Item">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <CityNameComplete><xsl:text> </xsl:text><xsl:value-of select="CityName"/> (<xsl:value-of select="AirportCode"/>) - <xsl:value-of select="AirportName"/><xsl:text> </xsl:text></CityNameComplete>
    </xsl:copy>
</xsl:template>

出力を正確に取得したくないノードを削除する必要があることに注意してください-あなたはそれを要求しなかったので、そして私は答えを乱雑にしたくなかったので、私は方法に関するコードを含めていませんそうする。

于 2012-06-27T12:14:41.470 に答える
1

これを行う 1 つの方法は、ID テンプレートに基づいて作成し、 item要素に一致する追加のテンプレートを用意してから、 concat関数を使用してCityNameComplete要素を出力することです。

<xsl:template match="Item">
  <Item>
     <xsl:apply-templates select="@*|node()"/>
     <CityNameComplete>
        <xsl:value-of select="concat(CityName, ' (', AirportCode, ') ', AirportName)"/>
     </CityNameComplete>
  </Item>
</xsl:template>

出力したくない要素をすべて無視するためのテンプレートも必要です。この場合、 CityCode要素とCityName要素以外のすべて

<xsl:template match="Item/*[not(self::CityCode|self::CityName)]"/>

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="Item/*[not(self::CityCode|self::CityName)]"/>

   <xsl:template match="Item">
      <Item>
         <xsl:apply-templates select="@*|node()"/>
         <CityNameComplete>
            <xsl:value-of select="concat(CityName, ' (', AirportCode, ') ', AirportName)"/>
         </CityNameComplete>
      </Item>
   </xsl:template>

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

入力 XML に適用すると、以下が出力されます。

<Root>
   <Item>
     <CityCode>ALV</CityCode>
     <CityName>ANDORRA LA VELLA</CityName>
     <CityNameComplete>ANDORRA LA VELLA (ALV) Andorra La Vella Hlpt</CityNameComplete>
   </Item>
</Root>
于 2012-06-27T12:18:22.953 に答える
0

<AirportCode>欠落および/または<AirportName>:を処理できるバージョンは次のとおりです。

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

    <!--Identity template. Matches everything that isn't matched
        by another template and copies it without modification.-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Item">
        <!--Copy the current element (Item) to the output.-->
        <xsl:copy>
            <!--Apply templates to attributes of Item and also the
            CityCode and CityName elements. All other nodes of
            Item will not be processed.-->
            <xsl:apply-templates select="CityCode|CityName|@*"/>
            <CityNameComplete>
                <!--Output the value of CityName.-->
                <xsl:value-of select="CityName"/>
                <!--Apply the template for AirportCode. If it doesn't exist,
                nothing will be output.-->
                <xsl:apply-templates select="AirportCode"/>
                <!--Apply the template for AirportName. If it doesn't exist,
                nothing will be output.-->
                <xsl:apply-templates select="AirportName"/>
            </CityNameComplete>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="AirportCode">
        <!--Output the value of AirportCode, surrounded by parenthesis and
        preceded by a space.-->
        <xsl:value-of select="concat(' (',.,')')"/>
    </xsl:template>

    <xsl:template match="AirportName">
        <!--Output the value of AirportName, preceded by a "space dash space".-->
        <xsl:value-of select="concat(' - ',.)"/>
    </xsl:template>

</xsl:stylesheet>
于 2012-06-27T19:15:25.250 に答える