1

XSL で最初の子要素を選択して名前を変更したいと考えています。しかし、それは実際には最初の子ではなく、最初の子の最初のノードに似ています。

XML は次のようになります。

<Root><Story>
 <CL>
  <BK>
   <name>...</name>
   <Address>...</Address>
  </BK> 
  <BK>
   <name>...</name>
   <Address>...</Address>
 </BK> 
 <BK>
   <name>...</name>
   <Address>...</Address>
  </BK> 
 </CL>
 <CL>
  <BK>
   <name>...</name>
   <Address>...</Address>
  </BK> 
  <BK>
   <name>...</name>
   <Address>...</Address>
 </BK> 
 <BK>
   <name>...</name>
   <Address>...</Address>
  </BK> 
 </CL>
</Story></Root>

他の要素をそのままにしておくなど、最初の<name>要素の<CL>名前を変更する必要があります。<name1><name>

<Root><Story>
 <CL>
  <BK>
   <name1>...</name1>
   <Address>...</Address>
  </BK> 
  <BK>
   <name>...</name>
   <Address>...</Address>
 </BK> 
 <BK>
   <name>...</name>
   <Address>...</Address>
  </BK> 
 </CL>
 <CL>
  <BK>
   <name1>...</name1>
   <Address>...</Address>
  </BK> 
  <BK>
   <name>...</name>
   <Address>...</Address>
 </BK> 
 <BK>
   <name>...</name>
   <Address>...</Address>
  </BK> 
 </CL>
</Story></Root>
4

3 に答える 3

0

完全で短い解決策は次のとおりです。

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="BK[1]/name">
  <name1>
   <xsl:apply-templates select="@*|node()"/>
  </name1>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Root><Story>
     <CL>
      <BK>
       <name>...</name>
       <Address>...</Address>
      </BK>
      <BK>
       <name>...</name>
       <Address>...</Address>
     </BK>
     <BK>
       <name>...</name>
       <Address>...</Address>
      </BK>
     </CL>
     <CL>
      <BK>
       <name>...</name>
       <Address>...</Address>
      </BK>
      <BK>
       <name>...</name>
       <Address>...</Address>
     </BK>
     <BK>
       <name>...</name>
       <Address>...</Address>
      </BK>
     </CL>
</Story></Root>

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

<Root>
   <Story>
      <CL>
         <BK>
            <name1>...</name1>
            <Address>...</Address>
         </BK>
         <BK>
            <name>...</name>
            <Address>...</Address>
         </BK>
         <BK>
            <name>...</name>
            <Address>...</Address>
         </BK>
      </CL>
      <CL>
         <BK>
            <name1>...</name1>
            <Address>...</Address>
         </BK>
         <BK>
            <name>...</name>
            <Address>...</Address>
         </BK>
         <BK>
            <name>...</name>
            <Address>...</Address>
         </BK>
      </CL>
   </Story>
</Root>

説明:

実際に必要なのは、子を持つ任意の要素 (この場合は)nameの最初の要素の子の名前を変更することです。BKCLBK

  1. アイデンティティ ルールは、(実行のために選択された) 一致したすべてのノードを「そのまま」コピーします。

  2. ID テンプレートは、親の最初の子である要素nameの子である要素に一致する単一のテンプレートによってオーバーライドされます。BKここでは、name1要素が生成され、テンプレートを適用するだけでその属性と本体が変更されずにコピーされます (これらは他の唯一のテンプレート (同一性ルール) によって照合および処理されるため)。

于 2012-07-06T13:04:48.130 に答える
0

質問が正しい要素を選択する方法に関するものであると仮定すると (見つけた要素を置き換える方法に関するものではありません)、次の XPath 式は、各要素<name>の最初の子の最初の要素を選択します。<CL>

/Root/Story/CL/*[1]/name[1]

<CL>の下で、任意の要素が選択されていることに注意してください( *)。この選択は、 によって親<CL>要素内の最初のそのような要素に制限され[1]ます。

更新: XSLT に埋め込まれた要素は、次のテンプレートで名前を変更できます。

<xsl:template match="/Root/Story/CL/*[1]/name[1]">
    <name1><xsl:apply-templates select="node()|@*"/></name1>
</xsl:template>

更新 2:<name>選択を最初の要素に制限しました。

于 2012-07-06T07:16:13.250 に答える
0

あなたのコメントを参照して、いいえ、WHEN/OTHERWISE を使用しないでください。テンプレートをオーバーライドする方法です。

次の XSLT 1.0 スタイルシートは、入力ドキュメントの特定の構造を想定せずに、「他の要素をそのままにしておくなど、最初の要素の名前を変更する必要がある」というルールを単純に解釈したものです ...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="name[(preceding::name | ancestor::CL)[last()]/self::CL]">
 <name1>
  <xsl:apply-templates select="@*|node()"/>
 </name1>
</xsl:template>

</xsl:stylesheet>

ノート

XSLT 2.0 を使用するか、入力ドキュメントの構造について特定の保証を行うことができれば、より簡単な解決策があります。これらの条件のいずれかに該当する場合は、質問を更新してください。

于 2012-07-06T08:23:12.733 に答える