문제

나는 두 값 사이에있는 노드가있는 항목 만 표시하는 xsl : if 문을 설정하려고합니다. 충분히 간단합니까? 그것은 단지 더 크고보다 적다면. 문제는 하나의 노드에서 테스트하는 대신 최대 52에 대해 테스트해야한다는 것입니다.

다음과 같은 XML이 있다고 가정 해 봅시다.

<container>
    <entry>
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
        <item>10</item>
    </entry>
</container>

이제 9-15의 범위가 주어 졌다고 말합니다. 일부 노드가 해당 범위에 속하기 때문에 해당 항목을 표시하고 싶습니다. 그러나 11-15의 범위가 주어지면 노드 중 어느 것도 맞지 않아 표시를 원하지 않을 것입니다.

문제는 ... 나는 당신이 어떻게 이것을 할 것인지 전혀 모른다는 것입니다. 단일 값이라면 각 노드를 테스트하는 간단한 방법을 생각할 수 없다는 것을 알고 있습니다.

그건 그렇고, 이것은 모두 Symphony CMS의 최신 안정적인 릴리스 내에서 이루어지고 있습니다.

편집] 처음 두 결과의 문제는 항목 노드를 표시하는 것입니다. 제가 찾고있는 것은 일치하는 항목 노드가 하나 이상인 항목 노드 만 반환하는 것입니다. 솔루션이 어떻게 도움이되는지 잘 모르겠습니다.

도움이 되었습니까?

해결책

중첩 술어를 사용하여 이것을 달성 할 수 있습니다. <entry> 성냥:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="container/entry[item[number(.) &gt;= 9 and number(.) &lt;= 15]]">
            <!-- this will loop over <entry>s which contain <item>s within your range -->
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

표현식은 "값이 9에서 15 사이의 항목을 포함하는 항목"으로 읽습니다.

다른 팁

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:copy-of select="container/entry/item[number(.) &gt;= 9 and number(.) &lt;= 15]"/>
    </xsl:template>
</xsl:stylesheet>

XPath 문 'Container/Entry/Item'은 모든 일치하는 항목을 나타냅니다. 술어 [숫자 (.)> = 9 및 번호 (.) <= 15]는 나열된 파라입니다. 일부 XSLT 작업 (예 : XSL : Value-of)에는 첫 번째 값 만 가져 오는 묵시적 필터가 있습니다. 이 경우 xsl : for-each : 사용할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="container/entry/item[number(.) &gt;= 9 and number(.) &lt; 15]">
            <xsl:value-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

이건 어때요 .... 당신은 for-e-each loop 내부에서 원하는 모든 것을 할 수 있거나 변수에서 반환 된 노드 세트를 가져 와서 다른 곳에서 사용할 수 있습니다.

   <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <!-- Your first param -->
        <xsl:param name="Param1" select="4"/>
        <!-- Your second param -->
        <xsl:param name="Param2" select="9"/>
            <xsl:variable name="ResultNodeSet">
                <xsl:for-each select="/container/entry/item[number(.) &gt;= $Param1 and number(.) &lt;= $Param2]">
                  <!-- What ever else you want to do can go here-->
                  <xsl:copy-of select="."/>
                </xsl:for-each>
            </xsl:variable>  
        <xsl:value-of select="$ResultNodeSet"/>
    </xsl:template> 
    </xsl:stylesheet>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top