这是我第一次处理带有嵌套元素的XML并寻求建议。我需要将输入XML转换为仅在XML输出中输出一个元素。
这是我的输入XML。我有两个<ImageId>
元素和两个<ReferenceNumber>
元素。我只需要输出一个<ImageId>
和一个<ReferenceNumber>
,它们是<InquireCase>
标签下的前两个元素。
如果我执行<xsl:copy-of select
,它将复制所有ReferenceNumber
字段。我有<ReferenceNumber>201801364201801364</ReferenceNumber>
的重复结果。如果我这样做,则<ImageId></ImageId>
元素中没有任何值。我做了<xsl:apply-templates select="ImageId></xsl:apply-templates>
,但XML输出显示为空白。
非常感谢您的帮助。
<?xml version='1.0'?>
<InquiryRequest>
<InquiryCase>
<ImageId>123453453</ImageId>
<ReferenceNumber>UDHD654634</ReferenceNumber>
</InquiryCase>
<Document>
<Lastname>MOUSE</Lastname>
</Document>
<InquiryCase>
<ImageId>123453453</ImageId>
<ReferenceNumber>UDHD654634</ReferenceNumber>
</InquiryCase>
</InquiryRequest>
到目前为止,这是我的XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:env ="urn:envision">
<xsl:output method="xml" indent="yes"/>
<msxsl:text disable-output-escaping="yes"></msxsl:text>
<xsl:template match="InquiryRequest">
<xsl:element name ="ImageId">
<xsl:value-of select="ImageId"/>
</xsl:element>
<xsl:element name="InquiryCase">
<xsl:element name ="ReferenceNumber">
<xsl:copy-of select="//InquiryCase/ReferenceNumber/text()"/>
</xsl:element>
</xsl:element> <!-- added by edit -->
</xsl:template>
<xsl:template match="ImageId">
<xsl:element name ="ImageId">
<xsl:apply-templates select="ImageId"></xsl:apply-templates>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
一个可能的解决方案是以下模板。 [1]
表示第一个InquiryCase
元素:
<xsl:template match="InquiryRequest">
<xsl:element name="InquiryCase">
<xsl:element name ="ImageId">
<xsl:value-of select="InquiryCase[1]/ImageId"/>
</xsl:element>
<xsl:element name ="ReferenceNumber">
<xsl:copy-of select="InquiryCase[1]/ReferenceNumber/text()"/>
</xsl:element>
</xsl:element> <!-- added by edit -->
</xsl:template>
输出为:
<?xml version="1.0" encoding="UTF-8"?>
<InquiryCase>
<ImageId>123453453</ImageId>
<ReferenceNumber>UDHD654634</ReferenceNumber>
</InquiryCase>
答案 1 :(得分:0)
<xsl:output method="xml" indent="yes"/>
<xsl:template match="InquiryRequest">
<xsl:copy>
<xsl:apply-templates select="InquiryCase"/>
</xsl:copy>
</xsl:template>
<xsl:template match="InquiryCase">
<xsl:copy>
<ImageId>
<xsl:value-of select="ImageId"/>
</ImageId>
<ReferenceNumber>
<xsl:value-of select="ReferenceNumber"/>
</ReferenceNumber>
</xsl:copy>
</xsl:template>
<xsl:template match="InquiryCase[following-sibling::InquiryCase/ImageId = current()/ImageId]"/>
You may also do like this.
答案 2 :(得分:0)
Here's the final layout that resolves my issue
<xsl:variable name="ImageId" select="descendant::ImageId"/>
<xsl:variable name="connStr" select="concat(env:GetScriptingLookup('@Database'), 'Trusted_Connection=YES')" />
<xsl:variable name="provider">System.Data.SqlClient</xsl:variable>
<xsl:variable name="DateTime">
<xsl:variable name="sqlXref">
SELECT CONVERT(VARCHAR(10), GETDATE(), 101) + ' ' + CONVERT(VARCHAR(13), GETDATE(), 108) AS 'CURRENT_DTTM' FROM IMAGES_DETAIL (nolock) WHERE IMAGE_ID = '<xsl:value-of select="$ImageId"/>'
</xsl:variable>
<xsl:value-of select="env:ExecuteScalar($provider, $connStr, $sqlXref)"/>
</xsl:variable>
<xsl:template match="InquiryRequest"> `enter code here`
<xsl:element name ="ImageId">
<xsl:value-of select="ImageId"/>
</xsl:element>
<xsl:element name="RequestDateTime">
<xsl:value-of select="$DateTime"/>
</xsl:element>
<xsl:element name="InquiryCase">
<xsl:element name ="ReferenceNumber">
<xsl:value-of select="InquiryCase[1]/ReferenceNumber"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>