2016-11-28 4 views
0

В интернете есть ссылки, посвященные передаче переменной в другой шаблон. Я пытался следовать всем ссылкам, но я не могу получить значение, которое мне нужно заполнить. У меня есть этот XML-файл:получить значение переменной в другой шаблон

<Item> 
    <Test> 
     <ID>123345677</ID> 
    </Test> 
    <DisplayID>99884534</DisplayID> 
</Item> 

Мне нужно заполнить MsgID элемент, если DisplayID не равно нулю, в противном случае получить значение из ID. Мой XSLT:

<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="ID"> 
    <xsl:variable name="IDV" select="substring(.,0,35)"/> 
    <xsl:apply-templates select="DisplayID"> 
     <xsl:with-param name="IDP" select="$IDV"/> 
    </xsl:apply-templates> 
</xsl:template> 
<xsl:template match="DisplayID"> 
    <xsl:param name="IDP"/> 
    <xsl:element name="MsgId"> 
     <xsl:choose> 
      <xsl:when test=".!='' or ./*"> 
       <xsl:value-of select="substring(.,0,35)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="substring($IDP,0,35)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:element> 
</xsl:template> 

условие, если DisplayID не нуль работает, однако, если удалить значение DisplayID, нет никакой ценности получать от ID. Я не знаю, правильно ли я это делаю.

Ваш отзыв высоко оценен.

+0

Непонятно, что вы подразумеваете под «нулем». Это может означать, что элемент вообще отсутствует, или это может означать, что элемент не имеет строкового значения. –

ответ

0

Пожалуйста, попробуйте это,

Demo для ссылок: http://xsltransform.net/ejivdHb/16

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns1="http://locomotive/bypass/docx" > 
<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="Item"> 
    <xsl:element name="MsgId"> 
     <xsl:choose> 
      <xsl:when test="DisplayID !='' "> 
       <xsl:value-of select="substring(DisplayID , 0 ,35)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="substring(Test/ID,0,35)"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Большое вам спасибо. – hannah

+0

@hannah рад помочь, upvote тоже? :) – ScanQR

+0

@hannah, почему этот сейчас неприемлемый ответ? У вас также есть xslt1.0? – ScanQR

0

Поскольку это меченая XSLT 2.0, матч = "Item" шаблон из @TechBreak можно заменить

<xsl:template match="Item"> 
    <MsgId> 
     <xsl:value-of select="substring(
      if (DisplayId != '') 
      then DisplayID 
      else Test/ID, 1 ,35)"/> 
    </MsgId> 
</xsl:template> 

(Примечание: счетчик знаков начинается с 1)