0

以下のようにタグ名が重複するxml XMLドキュメントがあります::

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

したがって、合計アドレスを取得する必要がありますが、XSLT を適用すると、最初のタグ値のみが取得されます。その ADDRESS タグ名を、STREET、CITY、STATE、ZIP タグなどの適切なタグ名に変更する可能性はありますか。

4

2 に答える 2

2

この変換:

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

 <my:reps>
  <rep pos="1">STREET</rep>
  <rep pos="1">CITY</rep>
  <rep pos="1">STATE</rep>
  <rep pos="1">ZIP</rep>
 </my:reps>

 <xsl:variable name="vReps"
      select="document('')/*/my:reps/*"/>

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

 <xsl:template match="ADDRESS">
  <xsl:variable name="vPos" select=
     "count(preceding-sibling::ADDRESS)+1"/>
  <xsl:element name="{$vReps[position()=$vPos]}">
    <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

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

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

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

<ROOT>
   <RECORD>
      <ID>A1</ID>
      <NAME>Name1</NAME>
      <STREET>StreetName</STREET>
      <CITY>CityName</CITY>
      <STATE>State</STATE>
      <ZIP>321</ZIP>
      <PHONE>12345</PHONE>
   </RECORD>
   <RECORD>
      <ID>A1</ID>
      <NAME>Name1</NAME>
      <STREET>StreetName</STREET>
      <CITY>CityName</CITY>
      <STATE>State</STATE>
      <ZIP>123</ZIP>
      <PHONE>12345</PHONE>
   </RECORD>
</ROOT>

説明:

テンプレート マッチングADDRESSを使用してアイデンティティ ルールをオーバーライドし、この要素の位置に従って要素を生成しADDRESSます。

于 2012-04-17T14:35:05.723 に答える
0

はい、必要に応じて名前を変更できますが、まだ持っていないものは何も得られません。通り市州という名前を持つことは、ノード address[1]、address[2]、address[3] を取得することと同じです。

于 2012-04-17T13:42:27.887 に答える