XSLT Как получить доступ к значению атрибута, когда он является целью совпадения - PullRequest
0 голосов
/ 10 мая 2018

Я много узнал о том, как получить доступ к значению атрибута, когда XSLT соответствует элементу.Но я не могу найти способ получить доступ к значению атрибута, когда сопоставление для этого атрибута.

Например, вот фрагмент моего исходного XML-файла:

    <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="">
      <mfrac>
        <mn>20</mn>
        <mn>60</mn>
      </mfrac>
      <mo>=</mo>
      <mfrac>
        <mi mathvariant="bold">x</mi>
        <mn>100</mn>
      </mfrac>
    </math>

И вот шаблон, который я использую (он не работает):

  <xsl:template match="mathml:math//mathml:mi/@mathvariant">
      <xsl:copy>
         <xsl:choose>
            <xsl:when test=".='bold'">
               <xsl:attribute name="mathvariant">
                  <xsl:value-of select="'bold-sans-serif'"/>
               </xsl:attribute>
            </xsl:when>
            <xsl:when test=".='italic'">
               <xsl:attribute name="mathvariant">
                  <xsl:value-of select="'sans-serif-italic'"/>
               </xsl:attribute>
            </xsl:when>
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose>
      </xsl:copy>
   </xsl:template>

Я хочу использовать команду stmt для изменения атрибута mathvariant элемента на основе его значения.Я знаю, что мне нужно сопоставить сам атрибут, чтобы изменить его значение (эта часть работает), но я не знаю, как получить доступ к значению сопоставленного атрибута в операторе when.test = ". = 'bold'" не работает.«Точка» не означает, что я думаю, это означает, что совпадение является атрибутом.Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Проблема с вашим кодом - xsl:copy. Когда элемент контекста является атрибутом, xsl:copy создает копию атрибута, и любые инструкции в теле инструкции xsl:copy игнорируются. Попробуйте просто удалить начальный и конечный теги xsl:copy. Я не гарантирую, что это сработает, потому что мы не видели код, содержащий xsl:apply-templates, который запускает это правило шаблона, но он должен, по крайней мере, гарантировать выполнение xsl:choose.

Использование test=".='bold'" совершенно нормально: когда контекстный элемент является атрибутом, "." в атомизирующем контексте дает строковое значение атрибута.

0 голосов
/ 10 мая 2018

Если вы хотите заменить значение атрибута mathvariant другим значением, вы можете использовать следующие шаблоны. Они оба работают вместе с шаблоном идентификации , копирующим остальную часть вашего XML.

<xsl:template match="mathml:mi/@mathvariant[.='bold']">
  <xsl:attribute name="mathvariant">
    <xsl:value-of select="'bold-sans-serif'"/>
  </xsl:attribute>
</xsl:template>   

<xsl:template match="mathml:mi/@mathvariant[.!='bold']">
  <xsl:attribute name="mathvariant">
    <xsl:value-of select="'sans-serif-italic'"/>
  </xsl:attribute>
</xsl:template>

Поэтому для XSLT-1.0 используйте шаблон идентификации

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

и для XSLT-3.0 вы можете использовать

<xsl:mode on-no-match="shallow-copy" />

Если вы хотите придерживаться xsl:choose, поместите его в xsl:attribute и сопоставьте связанный элемент:

<xsl:template match="mathml:mi/@mathvariant">
  <xsl:attribute name="mathvariant">
      <xsl:choose>
          <xsl:when test=".='bold'">                 
              <xsl:value-of select="'bold-sans-serif'"/>
          </xsl:when>
          <xsl:otherwise>
              <xsl:value-of select="'sans-serif-italic'"/>                
          </xsl:otherwise>
      </xsl:choose>
  </xsl:attribute>
</xsl:template> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...