XSLT: зацикливание и установка переменной, когда условие выполнено хотя бы один раз
Я пытаюсь перебрать узел, который в itselt не является проблемой. Я хочу проверить, соответствует ли selectedLetter первой букве узла, который работает должным образом (см. Код ниже). Трудности возникают из-за того, что я хотел бы представить какой-нибудь альтернативный текст, если условное "" не встречалось хотя бы один раз в цикле, в духе "Извините, документы не начинаются с этого письма". Я думал об установке переменной, т.е. флага в условном выражении, и позже проверял, была ли установлена эта переменная, но из того, что я прочитал здесь, область действия переменной ограничена и доступна только в цикле? Кто-нибудь может предложить какую-либо помощь?
Ура, тафф
<xsl:param name="selectedLetter" select="''"/>
<xsl:key name="docLetter" match="docs" use="substring(text()),1,1)"/>
<xsl:for-each select="//ad-documents/item">
<xsl:sort select="documentName"/>
<xsl:variable name="firstLetter" select="upper-case(substring(documentName, 1, 1))"/>
<xsl:choose>
<xsl:when test="$firstLetter = $selectedLetter">
<div class="doc-date">
<xsl:if test="upload-date/day < 10">0</xsl:if>
<xsl:value-of select="upload-date/day"/>
<xsl:text>.</xsl:text>
<xsl:if test="upload-date/month < 10">0</xsl:if>
<xsl:value-of select="upload-date/month"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="upload-date/year"/>
</div>
<div class="doc-link">
<a>
<xsl:attribute name="href">
<xsl:choose>
<xsl:when test="isEditableFormDoc/box = 'true'">
#
</xsl:when>
<xsl:otherwise>
<xsl:text>/img/ejbfile/</xsl:text>
<xsl:value-of select="documents/document/@documentName"/>
<xsl:text>?id=</xsl:text>
<xsl:value-of select="documents/document/@src"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:if test="isEditableFormDoc/box = 'true'">
<xsl:attribute name="target">
<xsl:text>_blank</xsl:text>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="documentName"/>
</a>
</div>
<div class="doc-short-desc">
<xsl:apply-templates select="document-short-desc" mode="format"/>
</div>
<!--<xsl:apply-templates select="//ad-documents/item" mode="filteredDocuments"/>-->
</xsl:when>
</xsl:choose>
</xsl:for-each>
РЕДАКТИРОВАТЬ:
Пример XML
<ad-documents name="ad-documents" label="Dokumente (limitiert auf 20 pro Seite)">
<item description="Doc%203" id="1" timestamp="1328525592205">
<documentName name="documentName" description="Doc%203">Doc 3</documentName>
<optionalLetter name="optionalLetter" description="c">c</optionalLetter>
<document-short-desc name="document-short-desc" description="">
<p>yxf</p>
</document-short-desc>
<upload-date name="upload-date" description="">
<day>24</day>
<month>2</month>
<year>2012</year>
</upload-date>
<isEditableFormDoc name="isEditableFormDoc" description="">
<box/>
</isEditableFormDoc>
<documents name="documents" description=""/>
</item>
<item description="Doc%204" id="2" timestamp="1328525624889">
<documentName name="documentName" description="Doc%204">Doc 4</documentName>
<optionalLetter name="optionalLetter" description="z%2Ci%2Cg">z,i,g</optionalLetter>
<document-short-desc name="document-short-desc" description="">
<p>asff</p>
</document-short-desc>
<upload-date name="upload-date" description="">
<day>25</day>
<month>2</month>
<year>2012</year>
</upload-date>
<isEditableFormDoc name="isEditableFormDoc" description="">
<box/>
</isEditableFormDoc>
<documents name="documents" description=""/>
</item>
<item description="Doc%201" id="1" timestamp="1328523551639">
<documentName name="documentName" description="Doc%201">Doc 1</documentName>
<optionalLetter name="optionalLetter" description="b%2Cc">b,c</optionalLetter>
<document-short-desc name="document-short-desc" description="">
<p>Short Desc 1</p>
</document-short-desc>
<upload-date name="upload-date" description="">
<day>9</day>
<month>2</month>
<year>2012</year>
</upload-date>
<isEditableFormDoc name="isEditableFormDoc" description="">
<box/>
</isEditableFormDoc>
<documents name="documents" description=""/>
</item>
</ad-documents>
2 ответа
Решение простое:
Просто замените:
<xsl:for-each select="//ad-documents/item">
с
<xsl:for-each select=
"//ad-documents/item
[$selectedLetter eq upper-case(substring(documentName, 1, 1) ]">
Вы можете добавить после этого xsl:for-each
<xsl:sequence select=
"'YourErrorMessage'
[not(//ad-documents/item
[$selectedLetter eq upper-case(substring(documentName, 1, 1) ]
)
]"
/>
Благодаря Dimitre мне удалось решить проблему с count()
<xsl:variable name="foundDocs" select="count(//ad-documents/item[$selectedLetter eq upper-case(substring(documentName, 1, 1))])"/>
<xsl:if test="$foundDocs = 0">
<div class="no-documents">
<xsl:text>Leider keine Dokumente gefunden</xsl:text>
</div>
</xsl:if>