У меня есть два элемента в моем XML-файле, и я хочу объединить 2 значения в одну строку. Это мое решение XSLT:

 <xsl:for-each select="housenumber/@value | housenumberletter/@value">
 <houseinformation>
 <xsl:variable name="info" select="xs:string((housenumber| housenumberletter)/@value)" />
 <valueString value="info"/>
 </houseinformation>
 </xsl:for-each>

Вот мой результат, когда я тестирую его в Oxygen:

<houseinformation>
<valueString value="info"/>
</houseinformation>
<houseinformation>
<valueString value="info"/>
</houseinformation>

Ожидаемый результат, который я хочу, такой:

<houseinformation>
<valueString value="4A"/>
</houseinformation>

Я также попробовал функцию concat , но она не сработала.

Как я могу объединить два элемента из XML в одну строку?

ОБНОВИТЬ:

Мой xml файл:

<xml>   
    <data>  
    <housenumber value="15"/>
    <houseletter value="A"/> 
    </data>
</xml> 
0
Fearcoder 17 Мар 2021 в 14:49

2 ответа

Лучший ответ

Учитывая ваш пример XML, следующая таблица стилей:

XSLT 2.0

<xsl:stylesheet version="2.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="/xml">
    <root>
        <xsl:for-each select="data">
            <xsl:variable name="info" select="(housenumber | houseletter)/@value" />
            <houseinformation>
                <valueString value="{$info}"/>
            </houseinformation>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

Вернется:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <houseinformation>
      <valueString value="15 A"/>
   </houseinformation>
</root>

Если вам не нужен разделитель пробелов, попробуйте:

<xsl:stylesheet version="2.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="/xml">
    <root>
        <xsl:for-each select="data">
            <xsl:variable name="info" select="(housenumber | houseletter)/@value" />
            <houseinformation>
                <valueString>
                      <xsl:attribute name="value" select="$info" separator=""/>
                </valueString>
            </houseinformation>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

Или просто:

<xsl:stylesheet version="2.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="/xml">
    <root>
        <xsl:for-each select="data">
            <houseinformation>
                <valueString value="{concat(housenumber/@value, houseletter/@value)}"/>
            </houseinformation>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>
1
michael.hor257k 17 Мар 2021 в 13:22

Переменная $info должна упоминаться с помощью $. В противном случае он думает, что вы пытаетесь выполнить XPath для элемента с именем info:

<xsl:for-each select="housenumber/@value | housenumberletter/@value">
  <houseinformation>
    <xsl:variable name="info" select="xs:string((housenumber| housenumberletter)/@value)" />
    <valueString value="$info"/>
   </houseinformation>
 </xsl:for-each>

Или избегайте переменной и просто вставьте это выражение в строку шаблона значения атрибута < / а>:

<xsl:for-each select="housenumber/@value | housenumberletter/@value">
  <houseinformation>
    <valueString value="{xs:string((housenumber| housenumberletter)/@value)}"/>
  </houseinformation>
</xsl:for-each>
0
Mads Hansen 17 Мар 2021 в 12:52