如何连接4个元素?

时间:2015-04-28 22:02:40

标签: xml xslt

我想在一行中显示地址。我该怎么做呢? 我的代码只展示了这一点:

<nc:StreetFullText>607 Main St W</nc:StreetFullText>

我知道我需要添加&#39; City&#39;,&#39; State&#39;,&#39; Zip&#39;到我的代码行AssociatedValue[@type='Street1']/Text的末尾,但我不知道该怎么做。

所需的输出

<nc:StreetFullText>607 Main St W, New York, DC 77777</nc:StreetFullText>

我的xml

      <EnumerationValue code="DC042015J">
    <AssociatedValue type="Street1">
      <Text>607 Main St W</Text>
    </AssociatedValue>
    <AssociatedValue type="City">
      <Text>New York</Text>
    </AssociatedValue>
    <AssociatedValue type="State">
      <Text>MN</Text>
    </AssociatedValue>
    <AssociatedValue type="Zip">
      <Text>77777</Text>
    </AssociatedValue>
  </EnumerationValue>
  <EnumerationValue code="DC046015J">

Xslt代码

<nc:StreetFullText>
    <xsl:variable name="vCourtORI">
        <xsl:value-of select="/Integration/Case/Court/CourtNCIC"/>
    </xsl:variable>
    <xsl:value-of select="document(concat($gEnvPath,'\Schemas\CourtXML\SimpleTypes\CourtLocationTextType.xml'))/SimpleTypeCompanion/EnumerationValue[@code=$vCourtORI]/AssociatedValue[@type='Street1']/Text"/>
</nc:StreetFullText>

2 个答案:

答案 0 :(得分:0)

考虑使用变量来选择文档中的所有AssociatedValue元素

<xsl:variable name="values" 
              select="document(concat($gEnvPath,'\Schemas\CourtXML\SimpleTypes\CourtLocationTextType.xml'))/SimpleTypeCompanion/EnumerationValue[@code=$vCourtORI]/AssociatedValue" />

然后你可以通过这样做来获得街道和地址的其余部分:

 <xsl:value-of select="concat($values[@type='Street1']/Text, ', ', $values[@type='City']/Text, ', ', $values[@type='State']/Text, ' ', $values[@type='Zip']/Text)"/>

或者,您可以写出单独的语句来显示地址,而不是尝试在一行中执行

<xsl:value-of select="$values[@type='Street1']/Text"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="$values[@type='City']/Text"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="$values[@type='State']/Text"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$values[@type='Zip']/Text"/>

答案 1 :(得分:0)

另一种选择是对匹配的xsl:apply-templates {看起来有多个EnumerationValue并在单独的模板中执行xsl:value-of

如果您需要以不同方式处理不同的EnumerationValue元素,则可以使用模式。在下面的示例中,我使用sft模式专门处理StreetFullText

(我也没有使用名称空间或document()来保持示例简单。)

XML输入

<SimpleTypeCompanion>
    <EnumerationValue code="DC042015J">
        <AssociatedValue type="Street1">
            <Text>607 Main St W</Text>
        </AssociatedValue>
        <AssociatedValue type="City">
            <Text>New York</Text>
        </AssociatedValue>
        <AssociatedValue type="State">
            <Text>MN</Text>
        </AssociatedValue>
        <AssociatedValue type="Zip">
            <Text>77777</Text>
        </AssociatedValue>
    </EnumerationValue>    
</SimpleTypeCompanion>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:variable name="vCourtORI" select="'DC042015J'"/> 
        <StreetFullText>
            <xsl:apply-templates select="/SimpleTypeCompanion/EnumerationValue[@code=$vCourtORI]" mode="sft"/>
        </StreetFullText>
    </xsl:template>

    <xsl:template match="EnumerationValue" mode="sft">
        <xsl:value-of select="*[not(@type='Zip')]/Text" separator=", "/>
        <xsl:value-of select="concat(' ',*[@type='Zip']/Text)"/>
    </xsl:template>

</xsl:stylesheet>

XML输出

<StreetFullText>607 Main St W, New York, MN 77777</StreetFullText>

我在我的示例中使用了XSLT 2.0,因为您没有指定版本。如果您使用的是XSLT 1.0,则可以使用xsl:value-of属性替换separator

  • xsl:for-each
  • 多个xsl:value-of
  • 使用xsl:value-of
  • 的单个concat()
  • 具有匹配覆盖的xsl:apply-templates
  • 等...

如果您使用的是XSLT 2.0,则还可以在xsl:value-of模板中使用一个EnumerationValue。但是阅读起来有点困难:

<xsl:value-of select="concat(string-join(*[not(@type='Zip')]/Text,', '),' ',*[@type='Zip']/Text)"/>