Прочитать и выбрать значения атрибута Css Style - PullRequest
0 голосов
/ 16 марта 2011

Как я могу прочитать элемент / тег, как показано ниже - используя xsl + xpath, я пытаюсь отформатировать вывод xml, чтобы прочитать тег выравнивания из атрибута style, но я не могу понять это ... (последнее средство c #)

РЕДАКТИРОВАТЬ : Чтобы сделать мой ответ ясным, я мог бы прочитать много HTML-документов, у меня, скорее всего, будет список разрешенных тегов, которые мне нужно проанализировать, так что не все потребуется для анализатак как я использую xslt для преобразования документа в xml, я пишу свое решение, имея в виду только xsl + xpath, однако, если бы я использовал c # и linq (для перебора документа) - очевидно, это настроит всестили, тогда я преобразую свой документ с другими дополнениями.

<h1 style="text-align: right;">Another chapter</h1>

Мой Xsl:

<xsl:template match="h1">
    <fo:block color="black" font-family="Arial, Verdana, sans-serif">
      <xsl:call-template name="set-alignment"/>
    </fo:block>
  </xsl:template>

<xsl:template name="set-alignment">
    <xsl:choose>
      <xsl:when test="@align='left'">
        <xsl:attribute name="text-align">start</xsl:attribute>
      </xsl:when>
      <xsl:when test="@align='center'">
        <xsl:attribute name="text-align">center</xsl:attribute>
      </xsl:when>
      <xsl:when test="@align='right'">
        <xsl:attribute name="text-align">end</xsl:attribute>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

Обратите внимание, что ниже определен только один стиль, но их может быть много ...(подчеркивание и т. д.)

Желаемый вывод:

<h1 text-align="start" text-decoration="underline" >Another chapter</h1>

1 Ответ

0 голосов
/ 16 марта 2011

С хорошо известным шаблоном токенизации эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="h1">
        <xsl:copy>
            <xsl:apply-templates select="@*[name()!='style']"/>
            <xsl:call-template name="tokenize-style"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template name="tokenize-style">
        <xsl:param name="pString" select="string(@style)"/>
        <xsl:choose>
            <xsl:when test="not($pString)"/>
            <xsl:when test="contains($pString,';')">
                <xsl:call-template name="tokenize-style">
                    <xsl:with-param name="pString"
                         select="substring-before($pString,';')"/>
                </xsl:call-template>
                <xsl:call-template name="tokenize-style">
                    <xsl:with-param name="pString"
                         select="substring-after($pString,';')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:attribute name="{normalize-space(
                                         substring-before($pString,':')
                                      )}">
                    <xsl:value-of select="normalize-space(
                                             substring-after($pString,':')
                                          )"/>
                </xsl:attribute>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Выход:

<h1 text-align="right">Another chapter</h1>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...