1

次のテンプレートがあり、xml を作成しています。1 つのテンプレートに複数の同様のコード ブロックがあります。親要素名に応じて、要素値は 1 つだけです。そして、私は完璧なアイデアではif testなく、代わりに使用することに疑いがありますか? template matchしかし、どうやって?:

   <xsl:template match="Adresse">
    <!-- TelefonG  -> "Telefon Geschäftlich" (ID = 1) -->
    <xsl:if test="TelefonG != '' or TelefonGZus != ''">
      <xsl:if test="PersonGuid != ''">
        <xsl:element name="AdrKontakt">
          <KontaktGuid>
            <xsl:value-of select="commonFunctions:createGuid()"/>
          </KontaktGuid>
          <PersonGuid>
            <xsl:value-of select="commonFunctions:convertGuid(PersonGuid)"/>
          </PersonGuid>
          <InfoText>
            <xsl:value-of select="commonFunctions:toHtmlEntities(TelefonG)"/>
          </InfoText>
          <Kommentar>
            <xsl:value-of select="commonFunctions:toHtmlEntities(TelefonGZus)"/>
          </Kommentar>
          <xsl:element name="KontaktTypID">1</xsl:element>
          <xsl:the-same-crap/>
        </xsl:element>
      </xsl:if>
    </xsl:if>

        <!-- TelefonP   -> "Telefon Privat" (ID = 2) -->
        <xsl:if test="TelefonP != '' or TelefonPZus != ''">
          <xsl:if test="PersonGuid != ''">
            <xsl:element name="AdrKontakt">
              <xsl:the-same-crap/>
              <xsl:element name="KontaktTypID">1</xsl:element>
              <xsl:the-same-crap/>
            </xsl:element>
          </xsl:if>
        </xsl:if>

        <!-- TelMobil -> "Telefon Mobil" (ID = 3) -->
        <xsl:if test="TelMobil != '' or TelMobilZus != ''">
          <xsl:if test="PersonGuid != ''">
            <xsl:element name="AdrKontakt">
              <xsl:the-same-crap/>
              <xsl:element name="KontaktTypID">3</xsl:element>
              <xsl:the-same-crap/>
            </xsl:element>
          </xsl:if>
        </xsl:if>

        <xsl:and-so-on/>

入力 xml は次のようになります。

...
<Adresse>
  <PersonGuid>THEGUID01234567890</PersonGuid>
  <TelefonP>0878938493</TelefonP>
  <TelefonPZus>Some text about this number</TelefonPZus>
  <TelefonG>9309340934</TelefonG>
  <TelefonGZus>First class customer.</TelefnoGZus>
  <TelefonM>090923409</TelefonM>
  <TelefonMZus>Mobile because not always in office.</TelefonMZus> 
  <Email>abuse@bad.com</Email>
  <EmailZus>suspect</EmailZus>
  <!-- and so one -->
</Adresse>
<Adresse>
  <Email>bla@foo.bar</Email>
  <TelefonM>0298309283</TelefonM>
<Adresse>
...

同じがらくたを一度だけ書くために、どのようにリファクタリングしますか? スイッチケース?例 TelefonP => 1; TelMobil => 3 など よろしくお願いします

4

1 に答える 1

1

まず、現在のテンプレートに加えて 2 番目のテンプレートを追加して、 PersonGuidのないAddresse要素を無視します。

<xsl:template match="Adresse[PersonGuid = '']" />

これは、3 つのテンプレートすべてで、PersonGuidがある新しい要素のみを出力するためです。これにより、この条件でそれぞれのxsl:ifをドロップできるため、テンプレートのコードが簡素化されます。

この場合、XSLT は常により具体的なテンプレートを優先することに注意してください。

コードのリファクタリングに関しては、ここでxsl:choose を使用するだけでよいと思いますが、出力しているAdrKontakt内に配置します。

<xsl:template match="Adresse">
 <AdrKontakt>
    <xsl:the-same-crap/>
    <KontaktTypID>
       <xsl:choose>
          <xsl:when test="TelefonG != '' or TelefonGZus != ''">1</xsl:when>
          <xsl:when test="TelefonP != '' or TelefonPZus != ''">1</xsl:when>
          <xsl:when test="TelMobil != '' or TelMobilZus != ''">3</xsl:when>
       <xsl:choose>
    </KontaktTypID>
    <xsl:the-same-crap/>
 </AdrKontakt>
</xsl:tempalte>

<xsl:template match="Adresse[PersonGuid = '']" />

ここで新しい要素を出力するためにxsl:elementを使用する必要は実際にはありません。要素を直接出力するだけです。

編集: 複数のAdrKontaktを出力する必要がある場合は、繰り返しコードを含めるために、パラメーターを使用して名前付きテンプレートを使用する可能性があります。

名前付きテンプレートは次のようになります。

<xsl:template name="AdrKontakt">
 <xsl:param name="KontaktTypID" />
 <AdrKontakt>
    <xsl:the-same-crap/>
    <KontaktTypID>
       <xsl:value-of select="$KontaktTypID" />
    </KontaktTypID>
    <xsl:the-same-crap/>
 </AdrKontakt>
</xsl:tempalte>

それを呼び出すには、次のようにします。

<xsl:template match="Adresse">
  <xsl:if test="TelefonG != '' or TelefonGZus != ''">
      <xsl:call-template name="AdrKontakt">
          <xsl:with-param name="KontaktTypID" select="'1'" />
      </xsl:call-template>
  </xsl:if>
  <xsl:if test="TelefonP != '' or TelefonPZus != ''">
     ...

他の条件についても同様です。xsl:lfを削除することはできませんが、繰り返されるコードは 1 か所でしか発生しません。

名前付きテンプレートAdrKontakt内では、現在のコンテキストは引き続きAdresse要素であるため、現在のように他の要素を出力することができます。

<xsl:template name="AdrKontakt">
 <xsl:param name="KontaktTypID" />
 <AdrKontakt>
    <InfoText>
       <xsl:value-of select="commonFunctions:toHtmlEntities(TelefonG)"/>
    </InfoText>
    <KontaktTypID>
       <xsl:value-of select="$KontaktTypID" />
    </KontaktTypID>
 </AdrKontakt>
</xsl:tempalte>
于 2013-09-02T08:01:12.250 に答える