Добавление префикса пространства имен к проблеме дочерних узлов - PullRequest
0 голосов
/ 19 апреля 2011

На самом деле, как я вижу, я могу добавить пространства имен. Потому что я очень близок к выходу, который я ожидаю увидеть. Первые коды:

XML:

<helptext>
    <h6>General configuration options.</h6>
    <h2>Changing not yet supported.</h2>
    <p>this is a <b>paragraph</b><br/>this is a new line</p>
</helptext>

XSL:

<xsl:template name="transformHelptext">
    <xsl:for-each select="./child::*">
        <xsl:element name="ht:{local-name()}">
            <xsl:choose>
                <xsl:when test="count(./child::*)>0">
                    <xsl:call-template name="transformHelptext"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

Пока все хорошо. Для линий <h6>..</h6> и <h2>...</h2> проблем нет. Но третья строка имеет дочерний узел, который является <b>. И почему-то «абзац» является единственным текстом, который отображается для этой строки. У меня ошибка в choose заявлении. Но я не могу понять это.

Спасибо

P.S: пространство имен ht определено в теге xsl-stylesheet, и это 'xmlns: ht = "http://www.w3.org/1999/xhtml"'

P.S: Я пытаюсь сделать так, чтобы я мог применять теги html, стили к моим конкретным узлам xml

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Входной XML:

<?xml version="1.0" encoding="UTF-8"?>
<helptext>
   <h6>General configuration options.</h6>
   <h2>Changing not yet supported.</h2>
   <p>this is a <b>paragraph</b><br/>this is a new line</p>
</helptext>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*|@*">
    <xsl:element name="ht:{local-name()}" namespace="http://www.w3.org/1999/xhtml">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

Выходной XML:

<?xml version="1.0" encoding="UTF-8"?>
<ht:helptext xmlns:ht="http://www.w3.org/1999/xhtml">
    <ht:h6>General configuration options.</ht:h6>
    <ht:h2>Changing not yet supported.</ht:h2>
    <ht:p>
       this is a
       <ht:b>paragraph</ht:b>
       <ht:br />
       this is a new line
    </ht:p>
</ht:helptext>

Обсуждение: По возможности избегайте использования <xsl:for-each>, так как это может замедлить процессор.

1 голос
/ 19 апреля 2011

Может быть, что-то вроде этого:

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

<xsl:template match="*" >
    <xsl:element name="ht:{local-name(.)}">
        <xsl:apply-templates select="@*|node()"  />
    </xsl:element>
</xsl:template>

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

Внутри храма "transformHelptext" выберите все атрибуты и узлы и примените к ним шаблоны.

Второй шаблон соответствует узлам элемента и изменяет пространство имен.Третий шаблон соответствует атрибутам и текстовым узлам и просто создает копию.

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