Как мне сделать, чтобы мой XSLT показывал элемент только тогда, когда он присутствует? - PullRequest
0 голосов
/ 17 октября 2018

Вот часть моего XML:

<ing>
    <amt>
        <qty>12</qty>
    </amt>
    <item>chicken thighs (boneless and skinned)</item>
</ing>
<ing>
    <amt>
        <qty>3</qty>
    </amt>
    <item>bay leaves</item>
</ing>
<ing>
    <amt>
        <qty>300</qty>
        <unit system="metric">gram(s)</unit>
    </amt>
    <item>oyster mushroom(s)</item>
    <prep>(torn into strips)</prep>
</ing>

Не каждый элемент <ing> имеет элемент <prep>, но я не хочу, чтобы строка элемента prep была в коде, если его нет вXML.

Вот мой текущий XSLT:

<xsl:template match="recipeml/recipe/ingredients">
    <h2><xsl:text>Ingredients</xsl:text></h2> 
    <xsl:for-each select="ing">
        <li>
            <xsl:value-of select="item"/>
            <ul><xsl:value-of select="amt"/></ul>
            <xsl:choose>
                <xsl:when test="following-sibling::prep">
                    <ul><i><xsl:value-of select="prep"/></i></ul>
                </xsl:when>
            </xsl:choose>
        </li>
    </xsl:for-each> 
</xsl:template>

То, что я пробовал до сих пор, либо дает мне:

<li>oyster mushroom(s)
  <ul>
      300
      gram(s)
  </ul>
</li>

Без <prep> или каждого *У 1015 * есть один, многие из которых пусты (<prep></prep>)

Есть ли способ сделать так, чтобы он появлялся только при наличии элемента?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Можно ли сделать так, чтобы он отображался только при наличии элемента?

Да.Используйте сопоставление с шаблоном.Здесь <xsl:template match="prep"> фактически вызывается только тогда, когда есть элемент <prep> (т. Е. Когда select="prep" выбирает что-либо).

<xsl:template match="ingredients">
    <h2><xsl:text>Ingredients</xsl:text></h2>
    <ul>
        <xsl:apply-templates select="ing" />
    </ul>
</xsl:template>

<xsl:template match="ing">
    <li>
        <div class="item"><xsl:value-of select="item" /></div>
        <div class="amount"><xsl:value-of select="amt"/></div>
        <xsl:apply-templates select="prep" />
    </li>
</xsl:template>

<xsl:template match="prep">
    <div class="preparation"><xsl:value-of select="." /></div>
</xsl:template>

Я также исправил HTML.Большинство вложенных элементов не могут быть юридически вложены таким образом.В любом случае, работать с CSS намного проще, поэтому я использовал <div> и классы CSS.

0 голосов
/ 17 октября 2018

вы уже находитесь в контексте узла ing в цикле for-each, замените

<xsl:when test="following-sibling::prep">

на

<xsl:when test="prep">

для проверки любого дочернего узла prep

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...