2014-10-20 2 views
1

Я сделал это xslt, он захватывает значение из XML, у меня есть параметры, которые я могу отправить для каждого, чтобы получить то, что мне нужно, он работает без проблем, мой для каждого выполните сравнение, и если значение соответствует моему параметру, тогда это будет сделано.Получить атрибуты из XML с помощью XSLT и параметров

Кто-нибудь знает, если это хороший способ сделать это? Я говорю это, потому что я новичок в XSLT, и именно так я понял, что может работать без проблем. Интересно, будет ли функция лучшим решением с точки зрения кодирования и скорости.

Cheers!

XSLT:

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

    <xsl:template match="/"> 
    <xsl:param name="param1" select="'ADM_1'"/> 
    <xsl:param name="param2" select="'ADM_2'"/> 
    <xsl:for-each select="//x:form/x:add"> 
     <xsl:if test="@name=$param1"> 
     Question1=<xsl:value-of select="."/> 
     </xsl:if> 
    </xsl:for-each> 

    <xsl:for-each select="//x:form/x:add"> 
     <xsl:if test="@name=$param2"> 
     <xsl:variable name="test"> 
      <xsl:value-of select="."/> 
     </xsl:variable> 
     Question2=<xsl:copy-of select="$test" /> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

XML:

<?xml version="1.0" encoding="iso-8859-1"?> 
<transaction xmlns="TransactionDataOfRequest" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <success>true</success> 
    <code>0</code> 
    <value> 
    <form> 
     <add name="ADM_1" title="Question 1" type="String" isList="false">No</add> 
     <add name="ADM_2" title="Question 2" type="String" isList="false">Yes</add> 
    </form> 
    </value> 
</transaction> 

ответ

1

Предполагая, что вы хотите, чтобы распечатать все вопросы и ответы, вы можете сделать это в общем с помощью простого применения шаблона:

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

    <xsl:template match="/"> 
     <xsl:apply-templates select="//x:form/x:add"></xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="x:add"> 
     <xsl:value-of select="@title"/>=<xsl:value-of select="."/> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

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

Вы можете сделать это императивно и и до сих пор СУХОЙ это вверх я думаю:

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

    <xsl:template match="/"> 
     <xsl:call-template name="processQuestion"> 
      <xsl:with-param name="name" select="'ADM_1'"></xsl:with-param> 
     </xsl:call-template> 
     <xsl:call-template name="processQuestion"> 
      <xsl:with-param name="name" select="'ADM_2'"></xsl:with-param> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="processQuestion"> 
     <xsl:param name="name"></xsl:param> 
     <xsl:apply-templates select="//x:form/x:add[@name=$name]" mode="process" /> 
    </xsl:template> 

    <xsl:template match="x:add" mode="process"> 
     <xsl:value-of select="@title"/>=<xsl:value-of select="."/> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Привет StuartLC, спасибо за ответ, мне нужно манипулировать элементами позже, так что мне нужно, чтобы получить их по отдельности. Вот почему я использую параметры. –

+0

Я обновил явные вызовы шаблону (функции) вызова. Вы все равно можете избежать 'for-each', совпадения ручного цикла и локальной переменной. – StuartLC

+1

Спасибо, Стюарт, это решение, которое я искал! –

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