Как использовать условия if (или когда) для атрибута внутри шаблона в xslt

#xslt

#xslt

Вопрос:

Всем привет,

Как использовать условие if для атрибута, чтобы выводить разное значение при каждом цикле. У меня есть атрибут с именем «attributeName». Это должно принимать другое имя, когда оно повторяется каждый раз (всего 5 раз).

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

Введите XML:

 <?xml version="1.0" encoding="UTF-8"?>
    </Solution>
    <Solution>
        <ID>22060000000000000000000002</ID>
        <Title>ABCD</Title>
        <Observations>
            <Observation>DEF</Observation>
        </Observations>
        <ProblemDescription> 1234</ProblemDescription>
        <ProblemCause>ADDD</ProblemCause>
        <RepairProcedures>
            <RepairProcedure>XYZ</RepairProcedure>
        </RepairProcedures>
        <ScenarioExplanation>
            <Scenario>JIJIJIJIJI</Scenario>
            <Scenario>SCENARIO1.</Scenario>
        </ScenarioExplanation>
        <DocumentReferences>
            <DocRef>NO DATA</DocRef>
        </DocumentReferences>
    </Solution>
</Solutions>
  

XSLT:

 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  

<xsl:stylesheet><xsl:template>  
            <xsl:element name="Tables">

            <!-- Tables code here -->

            </xsl:element>
            <xsl:element name="Relationships">
                <xsl:for-each select="Solutions/Solution">
                    <xsl:if test="RepairProcedures/RepairProcedure!= ''  ">
                        <xsl:for-each select="RepairProcedures/RepairProcedure">
                            <xsl:variable name="vNumCols" select="5"/>
                            <xsl:element name="Relationship">
                                <xsl:for-each select="position() amp;< vNumCols">
                                    <xsl:attribute name="Action"><xsl:value-of select="'Insert'"/></xsl:attribute>
                                    <xsl:attribute name="DestinationKey"><xsl:value-of select="1"/></xsl:attribute>
                                    <xsl:attribute name="RelationshipSpec"><xsl:value-of select="'TableName'"/></xsl:attribute>
                                    <xsl:attribute name="SourceKey"><xsl:value-of select="1"/></xsl:attribute>
                                    <xsl:attribute name="RelCommonKey"><xsl:value-of select="1"/></xsl:attribute>
                                    <xsl:attribute name="AttributeName">
                                    <xsl:if test="position() = 1"><xsl:value-of select="CPComments"/></xsl:if>
                                    <xsl:if test="position() = 2"><xsl:value-of select="CPConflict"/></xsl:if>
                                    </xsl:attribute>
                                    <xsl:attribute name="AttributeValue"><xsl:value-of select="1"/></xsl:attribute>
                                </xsl:for-each>
                            </xsl:element>
                        </xsl:for-each>
                    </xsl:if>
                </xsl:for-each>
            </xsl:element>
        </xsl:element>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>
  

Я просматриваю repairprocedures / repairprocedure, чтобы получить текст «RelationshipSpec».

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

 <Relationships>
<Relationship Action="Delete" DestinationKey="1" RelationshipSpec="XYZ" SourceKey="2" RelCommonKey="1_2" AttributeName="CPComments" AttributeValue=""/>  
<Relationship Action="Delete" DestinationKey="1" RelationshipSpec="XYZ" SourceKey="2" RelCommonKey="1_2" AttributeName="CPConflict" AttributeValue=""/>
<Relationship Action="Delete" DestinationKey="1" RelationshipSpec="XYZ" SourceKey="2" RelCommonKey="1_2" AttributeName="CPUserID" AttributeValue=""/>
<Relationship Action="Delete" DestinationKey="1" RelationshipSpec="XYZ" SourceKey="2" RelCommonKey="1_2" AttributeName="ProcessID" AttributeValue=""/>
<Relationship Action="Delete" DestinationKey="1" RelationshipSpec="XYZ" SourceKey="2" RelCommonKey="1_2" AttributeName="ProductId" AttributeValue=""/>         
</Relationships>
  

Единственное значение, измененное в этих 5 строках, — «имя_атрибута». Я пытаюсь напечатать 5 строк для одного отношения с другим именем атрибута.

Пожалуйста, помогите мне в этом.

Я использую XSLT 1.0

Спасибо, Рамм

Комментарии:

1. Для всех было бы проще, если бы вы могли предоставить образец ввода (ваш образец xml вообще не содержит никакого атрибута) и ожидаемый результат для этого ввода.

2. @qwerty: Мой входной xml предназначен только для печати значения RepairProcedure. Атрибутов не будет. Мой o / p будет иметь это значение. Я добавил xslt и ожидаемый результат. но его отображение пустое. Я думаю, что проблемы с форматированием. Я пробовал несколько раз.. но не уверен, как форматировать xslt .. ;(

3. Вы слишком часто используете <xsl:for-each>. Попробуйте использовать <xsl:apply-templates> вместо этого.

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

Ответ №1:

Разве что-то вроде:

 <xsl:if test="position() = 1">
    <xsl:attribute name="FirstAttribute">
        <xsl:value-of select="CPComments"/>
    </xsl:attribute>
</xsl:if>
<xsl:if test="position() = 2">
    <xsl:attribute name="SecondAttribute">
        <xsl:value-of select="CPConflict"/>
    </xsl:attribute>
</xsl:if>
  

работает?

Я бы, вероятно, предпочел <xsl:choose> , но в любом случае это не было бы короче.

Комментарии:

1. Привет, Ян. это добавляет дополнительный атрибут в ту же строку. Но мне нужно, чтобы этот атрибут «CPConflict» отображался во второй строке, а не в первой.