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

#xml #xslt

#xml #xslt

Вопрос:

Возможно, есть лучший способ описать мою проблему…

Вот пример того, что я хотел бы сделать:

Возьмите это:

 <inc_3c>
    <Title>This is 3C</Title>
    <Subtitle>Lorem ipsum dolor consectetur adipiscing elit. Fusce mattis consequat malesuada.</Subtitle>
    <Description>Consectetur adipiscing elit. Fusce mattis consequat malesuada. Nullam vel justo a dui pellentesque euismod. Integer eu pulvinar dolor.</Description>
    <Class>priceWrapper</Class>
    <Price>$00.00</Price>
    <Url>Url</Url>
    <Image>apple-tv.png</Image>
</inc_3c>
  

и скопируйте это следующим образом:

 <inc_3c-copy>
    <Title>This is 3C</Title>
    <Subtitle>Lorem ipsum dolor consectetur adipiscing elit. Fusce mattis consequat malesuada.</Subtitle>
    <Description>Consectetur adipiscing elit. Fusce mattis consequat malesuada. Nullam vel justo a dui pellentesque euismod. Integer eu pulvinar dolor.</Description>
    <Class>priceWrapper</Class>
    <Price>$00.00</Price>
    <Url>Url</Url>
    <Image>apple-tv.png</Image>
</inc_3c-copy>
  
  • inc_3c = будет заполнять содержимое на странице # 1
  • inc_3c-copy = будет заполнять содержимое на странице # 2

может быть даже сценарий, в котором inc_3c и inc_3c-copy находятся на одной странице.

надеюсь, мне не нужно будет создавать еще одну страницу XSL.

это должно быть доказательством отсутствия кода.

Комментарии:

1. Хороший вопрос, 1. Смотрите мой ответ для получения полного, очень короткого и простого решения, основанного на самом фундаментальном и мощном шаблоне проектирования XSLT — переопределении правила идентификации .

Ответ №1:

Узнайте об использовании правила идентификации / шаблона и его переопределении. Это само по себе является наиболее фундаментальным и мощным шаблоном проектирования XSLT.

В вашем случае мы используем этот шаблон проектирования для переопределения только верхнего элемента следующим образом:

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="/inc_3c">
  <inc_3c-copy>
   <xsl:apply-templates/>
  </inc_3c-copy>
 </xsl:template>
</xsl:stylesheet>
  

При применении к предоставленному XML-документу:

 <inc_3c>
    <Title>This is 3C</Title>
    <Subtitle>Lorem ipsum dolor consectetur adipiscing elit. Fusce mattis consequat malesuada.</Subtitle>
    <Description>Consectetur adipiscing elit. Fusce mattis consequat malesuada. Nullam vel justo a dui pellentesque euismod. Integer eu pulvinar dolor.</Description>
    <Class>priceWrapper</Class>
    <Price>$00.00</Price>
    <Url>Url</Url>
    <Image>apple-tv.png</Image>
</inc_3c>
  

получен желаемый, соответствующий результат:

 <inc_3c-copy>
   <Title>This is 3C</Title>
   <Subtitle>Lorem ipsum dolor consectetur adipiscing elit. Fusce mattis consequat malesuada.</Subtitle>
   <Description>Consectetur adipiscing elit. Fusce mattis consequat malesuada. Nullam vel justo a dui pellentesque euismod. Integer eu pulvinar dolor.</Description>
   <Class>priceWrapper</Class>
   <Price>$00.00</Price>
   <Url>Url</Url>
   <Image>apple-tv.png</Image>
</inc_3c-copy>
  

Комментарии:

1. Спасибо, Димитр, я собираюсь попробовать эту штуку. Я скоро похвалю вас!