XSLT Выбор на основе узла - PullRequest
       1

XSLT Выбор на основе узла

2 голосов
/ 27 октября 2011

У меня есть немного XML, таким образом

<root>
  <TemplateNode>
    <Heading>
      <ID>1</ID>
      <Name>HeadingNodeTest</Name>
      <Order>1</Order>
      <Text>This is a Heading Node</Text>
    </Heading>
  </TemplateNode>
  <TemplateNode>
    <SimpleText>
      <ID>2</ID>
      <Name>PlainTextNode</Name>
      <Order>2</Order>
      <Text>This is some plain text. Blah blah blah .. etc</Text>
     </SimpleText>
  </TemplateNode>
  <TemplateNode>
    <RadioTemplateNode>

... и т. Д.

Я хотел бы иметь возможность сделать выбор xslt на основе бита типа Заголовок / Простой текст, например

<xsl:for-each select="TemplateNode">
   <xsl:choose>
       <xsl:when test="TemplateNode/* = Header">
           ..do stuff
       </xsl:when>
       <xsl:when test="TemplateNode/* = SimpleText">
           ..do other stuffstuff
       </xsl:when>
       ...etc
   </xsl:choose>
</xsl:for-each select="TemplateNode">

* Могу ли я даже сделать что-то подобное, или мне лучше поменять XML на и выбрать его?

или мне нужно установить переменную и выбрать для этого ..?

спасибо nat

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Вы не должны адаптировать свои данные к своему коду. Если с вами XML в порядке, оставьте все как есть. Это будет работать, например,

<xsl:for-each select="/root/TemplateNode">
  <xsl:choose>
    <xsl:when test="Heading">
      ..do stuff
    </xsl:when>
    <xsl:when test="SimpleText">
      ..do other stuff
    </xsl:when>
  ...

Конечно, это работает, только если различные дочерние элементы TemplateNode взаимно исключают друг друга. Это еще один вариант:

<xsl:apply-templates select="/root/TemplateNode/*"/>

А потом

<xsl:template match="/root/TemplateNode/Heading">
    ..do stuff
</xsl:template>
<xsl:template match="/root/TemplateNode/SimpleText">
    ..do other stuff
</xsl:when>
0 голосов
/ 27 октября 2011

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

Вместо

<xsl:for-each select="TemplateNode"> 
   <xsl:choose> 
       <xsl:when test="TemplateNode/* = Header"> 
           ..do stuff 
       </xsl:when> 
       <xsl:when test="TemplateNode/* = SimpleText"> 
           ..do other stuffstuff 
       </xsl:when> 
       ...etc 
   </xsl:choose> 
</xsl:for-each select="TemplateNode"> 

Написать

<xsl:apply-templates select="TemplateNode"/>

А также есть эти шаблоны :

 <xsl:template match="TemplateNode[Heading]">
  <!-- Processing here -->
 </xsl:template>

 <xsl:template match="TemplateNode[SimpleText]">
  <!-- Processing here -->
 </xsl:template>

 <xsl:template match="TemplateNode[RadioTemplateNode]">
  <!-- Processing here -->
 </xsl:template>

Этот код проще и проще для понимания и обслуживания .

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