2013-01-21 19 views
0

我會改寫整個問題,因爲我幾乎有解決方案,並構建不好我的問題:XSLT置換加逗號,「與」

我的代碼:

<xsl:for-each select="documentarycredits/documentarycreditdata"> 
    <xsl:if test="tradetypes/option[@id='tradefinguar']='selected'">Trade Finance Guarantee</xsl:if> 
    <xsl:if test="tradetypes/option[@id='tradefinstand']='selected'">Trade Finance Standby Letters of Credit serving as Financial Guarantees</xsl:if> 
    <xsl:if test="tradetypes/option[@id='tradefindoc']='selected'">Trade Finance Documentary Credits</xsl:if> 
    <xsl:if test="position()!=last()"> 
    <xsl:text>, </xsl:text> 
    </xsl:if> 
    <xsl:if test="position()=last()-1"> 
     <xsl:text> and </xsl:text> 
    </xsl:if> 
    <xsl:if test="position()=last()"> 
     <xsl:text></xsl:text> 
    </xsl:if> 
</xsl:for-each> 

這似乎工作除了它有'和'例如'A和B'。

理想情況下,我想要A和B,其他任何東西都可以有E.G. A,B,C和F

即使我有20個值的下拉列表,我也想應用相同的值。

感謝

編輯對JLRish &添Ç回答評論:

  <tradetypes> 
      <option id="tradefinguar">selected</option> 
      <option id="tradefinstand"/> 
      <option id="tradefindoc"/> 
     </tradetypes> 

有這將導致許多單獨的XSLT屏幕所以它可能有不止上述三個可以選擇以倍數表示,例如A,A,B,C,A和B,但理想情況下,我希望知道是否已經選擇了一個已經生產過的產品。

+0

也許XSL-如果是更好地使用 – topcat3

+1

你能提供你的輸入XML的相關部分?你在用什麼XSLT處理器? – JLRishe

+0

我已經添加了這個問題。我接近得到它,但需要調整我的想法。 – topcat3

回答

2

你能做什麼,使我們的模板匹配。首先選擇選項元素已經被選擇

<xsl:apply-templates select="tradetypes/option[. = 'selected']"/> 

然後,你必須符合選項元素的模板,你的第一輸出無論是基於位置

<xsl:choose> 
    <xsl:when test="position() &gt; 1 and position() = last()"> and </xsl:when> 
    <xsl:when test="position() &gt; 1">,</xsl:when> 
    </xsl:choose> 

逗號或「和」當你有一個簡單的xsl:選擇輸出A,B或C

<xsl:choose> 
    <xsl:when test="@id='tradefinguar'">A</xsl:when> 
    <xsl:when test="@id='tradefinstand'">B</xsl:when> 
    <xsl:when test="@id='tradefindoc'">C</xsl:when> 
    </xsl:choose> 

下面是完整的XSLT

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

    <xsl:template match="/"> 
     <xsl:apply-templates select="tradetypes/option[. = 'selected']"/> 
    </xsl:template> 

    <xsl:template match="option"> 
     <xsl:choose> 
     <xsl:when test="position() &gt; 1 and position() = last()"> and </xsl:when> 
     <xsl:when test="position() &gt; 1">,</xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
     <xsl:when test="@id='tradefinguar'">A</xsl:when> 
     <xsl:when test="@id='tradefinstand'">B</xsl:when> 
     <xsl:when test="@id='tradefindoc'">C</xsl:when> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

當在下面的XML使用的,輸出是A

<tradetypes> 
    <option id="tradefinguar">selected</option> 
    <option id="tradefinstand"/> 
    <option id="tradefindoc"/> 
</tradetypes> 

當在下面的XML使用的,輸出是A and B

<tradetypes> 
    <option id="tradefinguar">selected</option> 
    <option id="tradefinstand">selected</option> 
    <option id="tradefindoc"/> 
</tradetypes> 

當用於以下XML時,輸出爲A, B and C

<tradetypes> 
    <option id="tradefinguar">selected</option> 
    <option id="tradefinstand">selected</option> 
    <option id="tradefindoc">selected</option> 
</tradetypes> 
+1

+1巧妙的解決方案 – JLRishe

+0

絕對是最好的解決方案。這在我的情況 \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t的 \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t的 \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t – topcat3

+0

@TimÇ對不起蒂姆,我可以問一個問題。有人可能會選擇上述選項中的5個,因此它可能是A,A,B,B和C.我希望它是這樣的,如果它們被選中一次就不會重複它們,並且對於一個特殊的「其他」自由文本框會重複這一點。例如A,B,其他1,其他2和C或其他1,A,其他2和C或類似物。不確定如果可能。 – topcat3

1

去了你的更新XSLT,我認爲下面的變化會做到這一點:

<xsl:for-each select="documentarycredits/documentarycreditdata"> 
    <xsl:for-each select="tradetypes/option[. = 'selected']"> 
     <xsl:if test="@id='tradefinguar'">Trade Finance Guarantee</xsl:if> 
     <xsl:if test="@id='tradefinstand'">Trade Finance Standby Letters of Credit serving as Financial Guarantees</xsl:if> 
     <xsl:if test="@id='tradefindoc'">Trade Finance Documentary Credits</xsl:if> 
     <xsl:choose> 
     <xsl:when test="position() + 1 = last()"> 
      <xsl:text> and </xsl:text> 
     </xsl:when> 
     <xsl:when test="last() > 1 and position() != last()"> 
      <xsl:text>, </xsl:text> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:for-each> 
+0

謝謝。我做了 and哪個工作正常,但你的是整齊的:) – topcat3

+0

對不起JL,我可以再問一個問題。有人可能會選擇上述選項中的5個,因此它可能是A,A,B,B和C.我希望它是如此,如果他們被選中,一旦它不會重複他們和一個特殊的「其他」自由文本框,它會重複這一點。例如A,B,其他1,其他2和C或其他1,A,其他2和C或類似物。不確定如果可能。 – topcat3

+1

因此,他們可以多次選擇相同的選項?您能否在上面的問題中顯示在輸入XML中看起來像什麼?同時顯示如何在輸入XML中表示自由文本項目。 – JLRishe