2016-02-09 2 views
0

Я пытаюсь преобразовать xml с помощью xslt, а xslt создается с помощью java, читая файл правил.Как применять разные правила для встроенных элементов узла в XSLT?

Предположим, что Xml - это что-то вроде этого.

<root> 
    <p> This is <span>India</span> &amp; is <span>tolerant</span> enough to <span>live</span>normal black here</p> 
    <p> Well <span>Pakistan</span> ,<span>Srilanka</span>, <span>Bangladesh</span>,<span>China</span> is our neighbouring country</p> 
</root> 

Я хочу первый пролет первого р должен быть окрашен в зеленых & втором не отображается, так как в нормальном черном & третьего синего цвета.

Аналогичным образом может быть больше нет. из встроенных элементов может произойти & будет иметь разные правила.

Аналогичным образом второй «p» будет иметь разные правила для разных встроенных элементов. Как я могу дифференцировать и применять это правило в xslt?

Java читает файл правила и динамически подготавливает xslt?

Может ли кто-нибудь предложить, как это сделать?

+0

Вы соответствуете вашему '' ы положение: 'пяди [1]' ... см [примеры XPath] (https://msdn.microsoft .com/en-us/library/ms256086.aspx). – Filburt

ответ

2

Что вы можете сделать, это иметь ряд шаблонов с различными правилами в условном совпадении. Например

<xsl:template match="p/span[1]"> 
    <span style="color:red"> 
     <xsl:apply-templates select="@*|node()"/> 
    </span> 
</xsl:template> 

<xsl:template match="p/span[2]"> 
    <span style="color:blue"> 
     <xsl:apply-templates select="@*|node()"/> 
    </span> 
</xsl:template> 

<xsl:template match="p/span[position() > 2]"> 
    <span style="color:green"> 
     <xsl:apply-templates select="@*|node()"/> 
    </span> 
</xsl:template> 

В качестве альтернативы, в случае соответствия span тегов, вы можете объединить их все в один шаблон, с xsl:choose вместо этого.

<xsl:template match="p/span"> 
    <xsl:variable name="position"> 
     <xsl:number /> 
    </xsl:variable> 
    <xsl:variable name="colour"> 
     <xsl:choose> 
      <xsl:when test="$position = 1">red</xsl:when> 
      <xsl:when test="$position = 2">green</xsl:when> 
      <xsl:otherwise>blue</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
     <span style="color:{$colour}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </span> 
</xsl:template> 

Попробуйте XSLT для начинающих

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="p/span"> 
     <xsl:variable name="position"> 
      <xsl:number /> 
     </xsl:variable> 
     <xsl:variable name="colour"> 
      <xsl:choose> 
       <xsl:when test="$position = 1">red</xsl:when> 
       <xsl:when test="$position = 2">green</xsl:when> 
       <xsl:otherwise>blue</xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
      <span style="color:{$colour}"> 
       <xsl:apply-templates select="@*|node()"/> 
      </span> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо за ваш быстрый ответ на это. Это работает только в том, что мне нужно записать много шаблонов. Еще раз спасибо Bikash –

Смежные вопросы