2016-03-21 2 views
0

Мне нужно создать XSLT-файл для преобразования входящего файла SAML в XML. Но мой файл преобразования не создает никакого вывода, и я не уверен, почему? Когда я пытаюсь подключить следующее к инструменту онлайн-трансляции и получить сообщение об ошибке «шаблон оценки ошибок в строке 5 в модуле»?XSLT transform file blank output

Входящие SAML:

<root> 
<saml:Attribute Name="State" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> 
    <saml:AttributeValue>OR</saml:AttributeValue> 
</saml:Attribute> 
<saml:Attribute Name="Pilot_Item" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> 
    <saml:AttributeValue>Skateboard</saml:AttributeValue> 
</saml:Attribute> 
<saml:Attribute Name="UserType" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> 
    <saml:AttributeValue>Broker</saml:AttributeValue> 
</saml:Attribute> 
<saml:Attribute Name="Pilot_Item" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> 
    <saml:AttributeValue>HandGlider</saml:AttributeValue> 
</saml:Attribute> 
<saml:Attribute Name="State" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> 
    <saml:AttributeValue>CA</saml:AttributeValue> 
</saml:Attribute> 
</root> 

XSLT преобразование файла:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<xsl:template match="/"> 
     <USERINFO> 
      <xsl:for-each select="//saml:Attribute[@Name='State']/saml:AttributeValue"> 
       <xsl:element name="field"> 
        <xsl:attribute name="name">State</xsl:attribute> 
        <xsl:attribute name="value"> 
         <xsl:value-of select="current()"/> 
         <xsl:if test="position()!=last()">,</xsl:if> 
        </xsl:attribute> 
       </xsl:element> 
      </xsl:for-each> 
      <xsl:for-each select="//saml:Attribute[@Name='Pilot_Item']/saml:AttributeValue"> 
       <xsl:element name="field"> 
        <xsl:attribute name="name">Custom1</xsl:attribute> 
        <xsl:attribute name="value"> 
         <xsl:value-of select="current()"/> 
         <xsl:if test="position()!=last()">,</xsl:if> 
        </xsl:attribute> 
       </xsl:element> 
      </xsl:for-each> 
      <xsl:for-each select="//saml:Attribute[@Name='UserType']/saml:AttributeValue"> 
       <xsl:element name="field"> 
        <xsl:attribute name="name">Group</xsl:attribute> 
        <xsl:attribute name="value"> 
         <xsl:value-of select="current()"/> 
         <xsl:if test="position()!=last()">,</xsl:if> 
        </xsl:attribute> 
       </xsl:element> 
      </xsl:for-each> 
     </USERINFO> 
</xsl:template> 
</xsl:stylesheet> 

Требуемая мощность:

<UserInfo> 
    <Custom1>Skateboard,HandGlider</Custom1> 
    <State>CA,OR</State> 
    <Group>Broker</Group> 
</UserInfo> 
+3

Ваш ввод неверно: префикс пространства имен 'saml' не определен. –

+0

Кроме того, вы должны сообщить нам, можете ли вы использовать XSLT 2.0 или ограничены ли вы XSLT 1.0 –

ответ

0

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

Кроме того, ваш код выглядит нормально, но ужасно подробный. Вот короткая версия:

<xsl:template match="/"> 
    <USERINFO> 
    <field name="State" 
      value="{string-join(//saml:Attribute[@Name='State']/saml:AttributeValue, ',')}"/> 
    <field name="Custom1" 
      value="{string-join(//saml:Attribute[@Name='Pilot_Item']/saml:AttributeValue, ',')}"/> 
    <field name="Group" 
      value="{string-join(//saml:Attribute[@Name='UserType']/saml:AttributeValue, ',')}"/> 
    </USERINFO> 
</xsl:template> 
0

здесь ваш solution

пространство имен SAML не был определен в исходном XML, но это было определено в вашем XSLT.

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

  • Нет связанных вопросов^_^