XSL / XML Получение атрибутов. Имя / Значение Пары - PullRequest
1 голос
/ 27 августа 2009

У меня есть простой XML-файл, который представляет собой список атрибутов (пары имя / значение):

<?xml version="1.0" encoding="ISO-8859-1"?>
<Attrs>
   <Attr N="IsValid" V="true" />
   <Attr N="ID" V="99099" />
 </Attrs>

Я хочу создать XSLT-файл, который выводит значения, но я не могу заставить его вернуть значение для атрибута


Вот мой xslt:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Attrs">
    <xsl:if test="Attr[@N='IsValid']">
      --found IsValid        
      IsValid 1: <xsl:value-of select="current()/Attr[@V]"/> 
      IsValid 2: <xsl:value-of select="Attr[@V]"/> 
    </xsl:if>
    <xsl:if test="Attr[@N='ID']">
      --found ID
      ID 1: <xsl:value-of select="current()/Attr[@V]"/> 
      ID 2: <xsl:value-of select="Attr[@V]"/> 
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Я просто не могу получить значение атрибута 'V' после нахождения соответствующего атрибута Name (N = 'name'). Я не знаю, как выбрать значение @V.

Вот мой вывод:

<?xml version="1.0" encoding="utf-8"?>
--found IsValid        
IsValid 1:  
IsValid 2: 
--found ID
ID 1:  
ID 2: 

В большинстве случаев я использовал приведенное ниже решение Энтони. Я изменил сопоставление с шаблоном, чтобы он просто использовал Attr, а затем использовал стемент выбора для фильтрации моих имен. В большинстве случаев мне просто нужно значение. В другом случае мне нужно было настроить, это действительно сократило количество шаблонов, которые мне нужны. (Еще раз спасибо за начало в правильном направлении всем, кто помог)

<xsl:template match="Attr">
<xsl:choose>
   <xsl:when test="@N='IsValid'">
      <xsl:value-of select="@V" />
   </xsl:when>
   <xsl:otherwise>
      <xsl:value-of select="@V" />
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

Вы должны использовать эти пути

 current()/Attr/@V

и

Attr/@V

Цель [] в Xpaths - описать предикат, то есть тест, который должен быть истинным элементом, против которого он помещается, если XPath прогрессирует.

Редактировать

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

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Attrs">
    <xsl:for-each match="Attr">
      <xsl:if test="@N='IsValid'">
       --found IsValid        
       IsValid 1: <xsl:value-of select="current()/@V"/> 
       IsValid 2: <xsl:value-of select="@V"/> 
      </xsl:if>
      <xsl:if test="@N='ID'">
        --found ID
        ID 1: <xsl:value-of select="current()/@V"/> 
        ID 2: <xsl:value-of select="@V"/> 
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

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

Еще одна версия, более соответствующая целям XSLT (я также отбрасываю current ()): -

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Attrs">
    <xsl:apply-templates />
  </xsl:template>  

  <xsl:template match="Attr[@N='IsValid']">
   --found IsValid        
   IsValid: <xsl:value-of select="@V" /> 
  </xsl:template>  

  <xsl:template match="Attr[@N='ID']">
    --found ID
    ID: <xsl:value-of select="@V"/> 
  </xsl:template>
</xsl:stylesheet>
1 голос
/ 30 августа 2009

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

<element IsValid='true' ID='2'/>

Пары имя / значение - это атрибуты XML для . (Пока значения не являются безумно длинными строками или иерархиями объектов.)

Тем не менее, вот простой набор шаблонов, который делает то, что вы ищете:

<xsl:template match="Attrs">
   <output>
      <xsl:apply-templates select="Attr"/>
   </output>
</xsl:template>       

<xsl:template match="Attr[@N='IsValid']">
   <xsl:text>IsValid=</xsl:text>
   <xsl:value-of select="@V"/>
</xsl:template>

<xsl:template match="Attr[@N='ID']">
   <xsl:text>ID=</xsl:text>
   <xsl:value-of select="@V"/>
</xsl:template>
1 голос
/ 27 августа 2009

Foreach медленный, разделите шаблоны следующим образом:

** Редактировать: ** ты меня избил ..

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Attrs">
    <xsl:apply-templates select="Attr" />  
  </xsl:template>
  <xsl:template match="Attr">
      <xsl:if test="@N='IsValid'">
       --found IsValid
        IsValid 2: <xsl:value-of select="@V"/>
       </xsl:if>
      <xsl:if test="@N='ID'">
        --found ID        
         ID 2: <xsl:value-of select="@V"/>
       </xsl:if>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...