xslt соответствующие теги разных имен - PullRequest
0 голосов
/ 17 февраля 2011
         <xsl:for-each select ="block4">
            <xsl:choose>
                <xsl:when test="tag[name = '57A']">
                    <xsl:value-of select="value"/>
                </xsl:when>
                <xsl:when test="tag[name = '57D'] ">
                    <xsl:value-of select="value"/>
                </xsl:when>
            </xsl:choose>,<xsl:text/>
        </xsl:for-each>

Я написал свой xslt вот так. Это не работает должным образом для этого XML:

<tag>
  <name>57A</name> 
  <value>NORTESMM</value> 
</tag>

Иногда название тегов будет меняться. Это должно быть либо 57A , либо 57D ​​, как указано в XSLT выше. Но это не дает правильного результата.

Ответы [ 5 ]

0 голосов
/ 17 февраля 2011

Это самое короткое и самое «решение в духе XSLT»:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="tag[name='57A']">value1 </xsl:template>
 <xsl:template match="tag[name='57D']">value2 </xsl:template>
</xsl:stylesheet>

применительно к этому документу XML :

<t>
    <tag>
        <name>57A</name>
        <value>NORTESMM</value>
    </tag>
    <tag>
        <name>57D</name>
        <value>NORTESMM</value>
    </tag>
</t>

желаемый, правильный результат:

value1 value2 

Примечание :

  1. Мы используем и переопределяем правило идентификации .Это самый фундаментальный и мощный шаблон проектирования XSLT.

  2. Мы не используем <xsl:for-each> и не используем условные инструкции XSLT .

Решение 2 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <my:values>
  <val tagname="57A">value1 </val>
  <val tagname="57B">value2 </val>
  <val tagname="57C">value3 </val>
  <val tagname="57D">value4 </val>
  <val tagname="57E">value5 </val>
 </my:values>

 <xsl:variable name="vVals" select=
   "document('')/*/my:values/*"/>

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

 <xsl:template match="tag">
  <xsl:value-of select="$vVals[@tagname=current()/name]"/>
 </xsl:template>
</xsl:stylesheet>

При применении к тому же XML-документу (см. Выше) снова получен требуемый, правильный результат :

value1 value4 

Обратите внимание : Это решение можно использовать, когда мы хотим обработать множество различных возможных значений tag/name.Мы используем таблицу для соответствующих значений и только один переопределяющий шаблон.

0 голосов
/ 17 февраля 2011
<xsl:template match="block4/tag">
  <xsl:if test="name='57A' or name='57D'">
    <xsl:value-of select="value"/>
  </xsl:if>
  </xsl:text>, <xsl:text/>
</xsl:template>

Это может отличаться в зависимости от того, как структурированы теги <block4> и <tag>.

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

0 голосов
/ 17 февраля 2011

Измените свой выбор на:

<xsl:value-of select="tag/value"/>

Полная программа:

XML:

<blocks>
  <block4>
    <tag>
      <name>57A</name>
      <value>NORTESMM</value>
    </tag>
  </block4>
  <block4>
    <tag>
      <name>57D</name>
      <value>FOO</value>
    </tag>
  </block4>
</blocks>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="blocks">
    <xsl:for-each select="block4">
      <xsl:choose>
        <xsl:when test="tag[name = '57A']">
          <xsl:value-of select="tag/value"/>
        </xsl:when>
        <xsl:when test="tag[name = '57D'] ">
          <xsl:value-of select="tag/value"/>
        </xsl:when>
      </xsl:choose>,<xsl:text/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

ВЫХОД:

NORTESMM,FOO
0 голосов
/ 17 февраля 2011

Попробуйте это

<xsl:for-each select ="block4">
<xsl:choose>
  <xsl:when test="tag/name = '57A'">
      <xsl:value-of select="tag/value"/>
  </xsl:when>
  <xsl:when test="tag/name = '57D'">
      <xsl:value-of select="tag/value"/>
  </xsl:when>
</xsl:choose>
</xsl:for-each>

Вы можете протестировать XSLT с помощью простого XML, создать два файла test.xsl и data.xml, а затем открыть data.xml в Firefox, например:

data.xml

<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
 <tag>
 <name>57A</name>
 <value>NORTESMM</value>
 </tag>

test.xsl

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title></title>
            </head>
            <body>
            <xsl:for-each select ="block4">
            <xsl:choose>
                <xsl:when test="tag/name = '57A'">
                    <xsl:value-of select="tag/value"/>
                </xsl:when>
                <xsl:when test="tag/name = '57D'">
                    <xsl:value-of select="tag/value"/>              
                </xsl:when>
            </xsl:choose>
            </xsl:for-each>
            </body>
        </html>
    </xsl:template></xsl:stylesheet>
0 голосов
/ 17 февраля 2011

1001 * попробовать *

<xsl:for-each select ="block4">
            <xsl:choose>
                <xsl:when test="tag/name = '57A'">
                    <xsl:value-of select="value"/>
                </xsl:when>
                <xsl:when test="tag/name = '57D'">
                    <xsl:value-of select="value"/>
                </xsl:when>
            </xsl:choose>,<xsl:text/>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...