Добавить верхний и нижний колонтитулы, если они не существуют с XSLT - PullRequest
3 голосов
/ 29 июля 2010

Как я могу иметь входной XML-код XSLT внутри родительского узла, только если он еще не существует?

Например, если мой ввод:

<Project>...</Project>

Я хочучтобы обернуть его префиксом и суффиксом:

<?xml version "1.0" encoding="utf-8">
<Site>
  <Project>...</Project>
</Site>

Если, однако, не является корневым узлом ввода, я бы хотел, чтобы вход не изменялся.

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 29 июля 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/Project">
        <Site>
            <xsl:call-template name="identity"/>
        </Site>
    </xsl:template>
</xsl:stylesheet>

Вход 1:

<Project>...</Project>

Выход 1:

<Site>
    <Project>...</Project>
</Site>

Вход 2:

<Root>
    <Project>...</Project>
</Root>

Выход 2:

<Root>
    <Project>...</Project>
</Root>

Примечание : преобразование идентичности.Сопоставление с образцом

1 голос
/ 29 июля 2010

Это преобразование :

<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()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*[not(self::site)]/Project">
  <site>
    <xsl:call-template name="identity"/>
  </site>
 </xsl:template>
</xsl:stylesheet>

охватывает элемент <Project> только в том случае, если он еще не является дочерним элементом <site> элемента.

При применении к этому XML-документу :

<t>
  <Project>x</Project>
    <site>
      <Project>y</Project>
    </site>
</t>

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

<t>
   <site>
      <Project>x</Project>
   </site>
   <site>
      <Project>y</Project>
   </site>
</t>
0 голосов
/ 29 июля 2010

Если вам нужно добавить только префикс и суффикс, вы можете найти другие опции Unix, такие как grep, которые могут сделать это намного проще. Если вы хотите сделать это в XSL, тогда вы должны использовать xsl: когда

<xsl:template match="/">
         <xsl:choose>       <!-- If Node Period exists add the text -->         <xsl:when test="Period">
                        <xsl:text><Site></xsl:text>
                        <xsl:text>&#xa;</xsl:text>
                        <xsl:text><Site></xsl:text>
            </xsl:when>     </xsl:choose>   <xsl:apply-templates select="Notification"/> </xsl:template>
...