2016-07-12 3 views
-1

Кажется, я застрял в получении правильной формы значения xsl. У меня есть следующий XML ВХОД:XSL получить значения из ввода XML

<root> 
<output> 
    <tagQ> 
     <tag name="X"> 
      <parameters> 
       <parameter name="id">83683</parameter> 
      </parameters> 
      <tagE/> 
      <tagR> 
       <R id="1"> 
        <column name="A">83683</column> 
        <column name="B">7260</column> 
        <column name="C">10</column> 
        <column name="D">2500</column> 
       </R> 
      </tagR> 
     </tag> 
    </tagQ> 
</output> 

и желаемый результат:

<newRoot> 
<output> 
    <tagQ> 
     <tag name="another"> 
      <parameters> 
       <parameter name="A">83683</parameter> 
       <parameter name="B">7260</parameter> 
       <parameter name="C">10</parameter> 
       <parameter name="D">2500</parameter> *//value of columns from input//* 
      </parameters> 
     </tag> 
    </tagQ> 
</output> 
</newRoot> 

Спасибо за вашу помощь. Я обновил вопрос с помощью текущего XSL, который у меня есть. выход хорош, но я не могу показаться, чтобы выяснить, как получить фактические значения

Edit: Текущий XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="*"> 
    <newRoot> 
     <output> 
      <tagQ> 
       <tag name="another"> 
        <parameters> 
         <parameter name="A"> 
          <xsl:value-of select="@*[@A]"/> 
         </parameter> 
         <parameter name="B"> 
          <xsl:value-of select="@*[@A]"/> 
         </parameter> 
         <parameter name="C"> 
          <xsl:value-of select="@*[@A]"/> 
         </parameter> 
         <parameter name="D"> 
          <xsl:value-of select="@*[@A]"/> 
         </parameter> 
        </parameters> 
       </tag> 
      </tagQ> 
     </output> 
    </newRoot> 
</xsl:template> 

+0

** 1 ** Где именно вы застряли в этом? ** 2. ** Откуда взялось значение «0000»? –

+0

Покажите нам, что вы пробовали до сих пор, и неправильный вывод, который он производит. –

+0

Исправлено с помощью значения tag name = "another". – user3529643

ответ

0

Ваш подход не работает, потому что

<xsl:value-of select="@*[@A]"/> 

ничего не выбирает. Вы находитесь в контексте элемента root - и ваше выражение пытается выбрать любой атрибут (текущего узла), у которого есть дочерний атрибут с именем A. Конечно, такого животного не существует.

Вы бы имели больше успеха с:

<xsl:value-of select=".//column[@name='A']"/> 

, который выбирает потомок элемента с именем column которого name атрибут является "A".

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

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="/root"> 
    <newRoot> 
     <xsl:apply-templates/> 
    </newRoot> 
</xsl:template> 

<xsl:template match="tag[@name='X']"> 
    <tag name="another"> 
     <parameters> 
      <xsl:apply-templates select="tagR/R/column"/> 
     </parameters> 
    </tag> 
</xsl:template> 

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

</xsl:stylesheet> 
+0

спасибо, что вы правы! еще один вопрос. Если бы я хотел изменить вывод имени атрибута 83683, и я хотел вместо name = "whatever", как бы вы могли пойти с совпадением шаблона? те же значения, просто другое имя для attirbute «name» – user3529643

+0

Я боюсь, что вы меня смутили: если вы хотите иметь 'name =" независимо от того, '' что изменило бы ** значение ** атрибута name. Но тогда вы говорите «* просто другое ** имя ** для attirbute« name »*»; что приведет к 'whatever =" A ". –

+0

«f вы хотите иметь имя =« что угодно », которое изменило бы значение атрибута имени» - это правильно. Значение атрибута name, которое я имел в виду. извините – user3529643

Смежные вопросы