используйте xslt, чтобы изменить только несколько элементов XML, оставив все то же самое - PullRequest
5 голосов
/ 22 июля 2011

У меня следующая проблема с XSLT.

В XML-документе у меня есть несколько тегов <h></h>, встроенных в различные уровни тегов <div></div>.

Чтобы изменить все значения <h></h> на <h1></h1> <h2></h2> <h3></h3> в зависимости от места попадания в различные разделы div, я написал следующий скрипт XSLT.

<xsl:template match="//TU:div/TU:h">
    <h1><xsl:apply-templates/></h1>
</xsl:template>

<xsl:template match="//TU:div/TU:div/TU:h">
    <h2><xsl:apply-templates/></h2>
</xsl:template>

И так далее. , , , Проблема в том, что я хочу, чтобы все остальное оставалось точно таким же. Я хочу изменить только теги <h></h>.

К сожалению, когда я обрабатываю документ, теги <h></h> меняются по желанию, но все остальные элементы исчезают.

Есть ли другое решение этой проблемы, кроме простого написания <xsl:template> для каждого элемента, чтобы каждый данный элемент был заменен на себя?

Например, для элемента <p></p>:

<xsl:template match="//TU:p">
    <p><xsl:apply-template/></p>
</xsl:template>

Мне нужно сделать что-то подобное, чтобы сохранить каждый элемент, или есть лучший способ?

Спасибо за вашу помощь.

Ответы [ 2 ]

9 голосов
/ 22 июля 2011

Добавить шаблон идентификации, чтобы соответствовать всему остальному ...

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

<xsl:template match="TU:h">
  <xsl:variable name="id" select="count(ancestor::TU:div)" />
  <xsl:element name="h{$id}" namespace="TUSTEP">
     <xsl:apply-templates select="@* | node()" />
  </xsl:element>
</xsl:template>
0 голосов
/ 22 июля 2011

Попробуйте общий шаблон, подобный этому:

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...