我的XSLT中有以下代码行,我正在对ExtendedAttributes
(重复元素)进行模板匹配并检查某些名称模式,
如果我的模式匹配,那么我需要获取该值并使用名为<Proxy> </Proxy>
的元素进行换行。
<xsl:for-each select="/OTF/Order/OrderHeader/ExtendedAttributes">
<xsl:element name="Proxy">
<xsl:choose>
<xsl:when test="current()/Name = 'ProxyFNm'">
<xsl:element name="FirstName">
<xsl:value-of select="current()/Value"/>
</xsl:element>
</xsl:when>
<xsl:when test="current()/Name = 'ProxyLNm'">
<xsl:element name="LastName">
<xsl:value-of select="current()/Value"/>
</xsl:element>
</xsl:when>
<xsl:when test="current()/Name = 'ProxyContact#'">
<xsl:element name="Phone">
<xsl:value-of select="current()/Value"/>
</xsl:element>
</xsl:when>
<xsl:when test="current()/Name = 'ProxyEmailID'">
<xsl:element name="Email">
<xsl:value-of select="current()/Value"/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:for-each>
输出:
<Proxy>
<FirstName>Rob</FirstName>
</Proxy>
<Proxy>
<LastName>Johnson</LastName>
</Proxy>
<Proxy>
<Email>hello@gmail.com</Email>
</Proxy>
<Proxy>
<Phone>8000000000</Phone>
</Proxy>
如果我将<xsl:element name="Proxy">
移动到约 - 每个我得到我想要的输出并且事情是好的。
问题出在我的输入中,如果我没有匹配(<xsl:when test="current()/Name = 'ProxyFNm'">)
那么它就是在创建我不想要的空元素<Proxy/>
。
有人可以建议我更好地处理这种情况吗?
谢谢。
答案 0 :(得分:1)
如果您希望仅在符合条件的情况下才应用for-each
,则需要将<xsl:for-each select="/OTF/Order/OrderHeader/ExtendedAttributes">
替换为<xsl:for-each select="/OTF/Order/OrderHeader/ExtendedAttributes[Name = 'ProxyFNm' or Name = 'ProxyLNm' or Name = 'ProxyContact#' or Name = 'ProxyEmailID']">
。
我会将整个代码重构为模板,例如
<xsl:template match="ExtendedAttributes[Name = 'ProxyFNm']">
<Proxy>
<FirstName>
<xsl:value-of select="Value"/>
</FirstName>
</Proxy>
</xsl:template>
(等等其他可能的Name
值),然后您可以将for-each
替换为<xsl:apply-templates select="/OTF/Order/OrderHeader/ExtendedAttributes[Name = 'ProxyFNm' or Name = 'ProxyLNm' or Name = 'ProxyContact#' or Name = 'ProxyEmailID']">
。
使用XSLT 2.0,条件Name = 'ProxyFNm' or Name = 'ProxyLNm' or Name = 'ProxyContact#' or Name = 'ProxyEmailID'
可以表示为Name = ('ProxyFNm', 'ProxyLNm', 'ProxyContact#', 'ProxyEmailID')
。
将模板重组为
甚至可能更好<xsl:template match="ExtendedAttributes">
<Proxy>
<xsl:apply-templates select="Name"/>
</Proxy>
</xsl:template>
<xsl:template match="ExtendedAttributes/Name[. = 'ProxyFNm']">
<FirstName>
<xsl:value-of select="../Value"/>
</FirstName>
</xsl:template>
当然为Name
的其他值添加了类似的模板。