1

我有以下模板,创建一个 xml。一个模板中有多个相似的代码块。根据父元素名称,只有一个元素值。而且我怀疑使用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

首先,除了您当前的模板之外,我将添加第二个模板以忽略没有PersonGuid的Addresse元素

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

这是因为在所有三个模板中,您只输出有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,但您重复的代码现在只会出现在一个地方。

请注意,在命名模板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 回答