1

単純なXSLT変換を作成するのに問題があります。XMLデータは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
  <lst name="params">
  </lst>
</lst>
<result name="response" numFound="2" start="0">
  <doc>
    <str name="Race">Elf</str>
    <int name="TraderKey">128</int>
    <str name="TraderName">TraderLato</str>
    <int name="CharacterName">Maleysh</int>
  </doc>
  <doc>
    <str name="Race">Human</str>
    <int name="TraderKey">62</int>
    <str name="TraderName">TraderSam</str>
    <int name="Comments">Farl</int>
  </doc>
</result>
</response>

入ってくるXMLのフォーマットを変更することはできず、たくさんのノードがあります。元のXMLをすべてコピーするが、特定のTraderKey値のTraderNameを置き換えるXSLT1.0変換を記述できる必要があります。TraderKeyが128のノードでは、TraderNameを「TraderLatoCarum」に変更します。TraderKeyが62の場合は、TraderNameを「TraderSamsonVero」に変更します。私はこれまでXSLTを作成したことがなく、XMLの経験も限られているため、これがXSLT変換を作成するための私の試みです。

<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="response/result/doc/int[@name='TraderKey'][. = '128']>
   <xsl:value-of select="../TraderName"/>
   <xsl:text>Trader Lato Carum</xsl:text>
  </xsl:template>

  <xsl:template match="response/result/doc/int[@name='TraderKey'][. = '62']>
   <xsl:value-of select="../TraderName"/>
   <xsl:text>Trader Samson Vero</xsl:text>
  </xsl:template>

</xsl:stylesheet>

それはまったく機能せず、私は過去1時間壁に頭をぶつけてきました。これは難しい問題ではないと思いますが、何が間違っているのでしょうか。

ありがとうzoombini

4

2 に答える 2

1

あなたはあなたが行っていたアイデンティティ/コピーパターンで正しい方向に進んでいました、あなたはただ少しの条件付き出力を必要とします。

このXMLPlaygroundでのデモ(出力ソースを参照)

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select='@*' />
        <xsl:apply-templates select='*' />
        <xsl:choose>
            <xsl:when test='@name = "TraderName" and preceding-sibling::*[@name = "TraderKey"] = 62'>
                Trader Samson Vero
            </xsl:when>
            <xsl:when test='@name = "TraderName" and preceding-sibling::*[@name = "TraderKey"] = 128'>
                Trader Lato Carum
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select='text()' />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>
于 2012-07-27T18:21:11.377 に答える
0

xsl:apply-templates解決策は、XSLT条件付き命令(、、など)を使用せずに、純粋なプッシュスタイル(明示的なし)でxsl:choose単純xsl:whenにすることができます。xsl:otherwiseしたがって、より短く、より読みやすく、理解しやすくなります

<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=
  "*[int[@name='TraderKey'] = 128]
          /str[@name='TraderName']
            /text()">
  <xsl:text>Trader Lato Carum</xsl:text>
 </xsl:template>

 <xsl:template match=
  "*[int[@name='TraderKey'] = 62]
          /str[@name='TraderName']
            /text()">
  <xsl:text>Trader Samson Vero</xsl:text>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<response>
    <lst name="responseHeader">
        <lst name="params"></lst></lst>
    <result name="response" numFound="2" start="0">
        <doc>
            <str name="Race">Elf</str>
            <int name="TraderKey">128</int>
            <str name="TraderName">TraderLato</str>
            <int name="CharacterName">Maleysh</int>
        </doc>
        <doc>
            <str name="Race">Human</str>
            <int name="TraderKey">62</int>
            <str name="TraderName">TraderSam</str>
            <int name="Comments">Farl</int>
        </doc>
    </result>
</response>

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

<response>
   <lst name="responseHeader">
      <lst name="params"/>
   </lst>
   <result name="response" numFound="2" start="0">
      <doc>
         <str name="Race">Elf</str>
         <int name="TraderKey">128</int>
         <str name="TraderName">Trader Lato Carum</str>
         <int name="CharacterName">Maleysh</int>
      </doc>
      <doc>
         <str name="Race">Human</str>
         <int name="TraderKey">62</int>
         <str name="TraderName">Trader Samson Vero</str>
         <int name="Comments">Farl</int>
      </doc>
   </result>
</response>
于 2012-07-28T17:35:46.443 に答える