0

xslt の要素の値を取得する方法。私のxmlが次のようになっているとします。

<comp>
 <link ref=1>1997</link>
 <link ref=2><?LINK 2008?></link>
</comp>

私はこのような出力が必要です、

<comp>
  <link ssref=1/><num>1997</num>
  <link ssref=2/><num>2008</num>
</comp>

リンクに値がある場合は、その値を取得する必要があります。このような場合は、それ<?LINK 2008?>から1年が必要です。次のxslを使用しましたが、機能していません。

<xsl:template match ="link">
<xsl:element name ="{local-name(.)}">
  <xsl:attribute name ="sshref">
    <xsl:value-of select ="@ref"/>
  </xsl:attribute>
    </xsl:element>
<xsl:if test="text()">
  <xsl:element name ="num">
    <xsl:value-of select ="link"/>
  </xsl:element>
</xsl:if>
</template>

私はこのxslが間違っていることを知っています。参考のために投稿しました。前もって感謝します。

4

3 に答える 3

3

まず、属性はアポストロフィまたは引用符で囲む必要があるため、XMLは整形式ではありませんが、これは単純なタイプミスである可能性があります。

特定の問題は処理命令であるため、text()をチェックするxsl:ifはこれを取得しません。

<xsl:value-of select="link" />また、現在のコンテキストがすでにリンク要素上にあるために問題が発生しているため、これは現在のリンク要素の子である別のリンク要素を探しています。あなたはおそらくこのようなことをしたいだけです

<xsl:value-of select="." />

だから、あなたはそのようにあなたのテンプレートを書き直すことができます

<xsl:template match="link">
    <xsl:element name="{local-name(.)}">
        <xsl:attribute name="sshref">
            <xsl:value-of select="@ref"/>
        </xsl:attribute>
        <xsl:if test="text()|processing-instruction()">
            <xsl:element name="num">
                <xsl:apply-templates select="text()|processing-instruction()"/>
            </xsl:element>
        </xsl:if>
    </xsl:element>
</xsl:template>

<xsl:template match="processing-instruction()">
    <xsl:value-of select="."/>
</xsl:template>

ただし、多くの場合、 xsl:if要素の使用を避け、代わりにテンプレートマッチングの機能を使用する方がよいことに注意してください。代わりに、この代替XSLTを試してください。

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

   <xsl:template match="link[text()|processing-instruction()]">
      <link>
         <num>
            <xsl:apply-templates select="text()|processing-instruction()"/>
         </num>
      </link>
   </xsl:template>

   <xsl:template match="link/@ref">
      <xsl:attribute name="ssref">
         <xsl:value-of select="."/>
      </xsl:attribute>
   </xsl:template>

   <xsl:template match="processing-instruction()">
      <xsl:value-of select="."/>
   </xsl:template>

   <xsl:template match="@*|node()[not(self::processing-instruction())]">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

次のXMKに適用した場合

<comp>
   <link ref="1">1997</link>
   <link ref="2"><?LINK 2008?></link>
</comp>

以下が出力されます。

<comp>
   <link sshref="1">
      <num>1997</num>
   </link>
   <link sshref="2">
      <num>2008</num>
   </link>
</comp>

動的に名前が付けられた要素が必要でない限り、xsl:elementを使用する必要はないことに注意してください。

于 2012-07-26T10:45:55.973 に答える
2

実行できる最も単純な XSLT 変換は次のようになります。

<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="link/text() | link/processing-instruction()">
    <num><xsl:value-of select="normalize-space()" /></num>
  </xsl:template>

  <xsl:template match="link/@ref">
     <xsl:attribute name="ssref"><xsl:value-of select="."/></xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

変形する

<comp>
 <link ref="1">1997</link>
 <link ref="2"><?LINK 2008?></link>
</comp>

望ましい結果に。

<comp>
 <link ssref="1"><num>1997</num></link>
 <link ssref="2"><num>2008</num></link>
</comp>
于 2012-07-26T11:18:30.997 に答える
1

XML の形式が適切ではありません。次のようにする必要があります。

<comp>
  <link ref="1">1997</link>
  <link ref="2"><?LINK 2008?></link>
</comp>

次に、次の XSLT を使用して目的の結果を得ることができます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:element name="comp">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="comp/link">
    <xsl:element name="{local-name(.)}">
      <xsl:attribute name="sshref"><xsl:value-of select="@ref"/></xsl:attribute>
    </xsl:element>
    <xsl:if test="text()|processing-instruction()">
      <xsl:element name="num">
        <xsl:apply-templates select="text()|processing-instruction()"/>
      </xsl:element>
    </xsl:if>
  </xsl:template>
  <xsl:template match="processing-instruction()">
    <xsl:value-of select="."/>
  </xsl:template>
</xsl:stylesheet>
于 2012-07-26T11:00:04.173 に答える