首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立一对一关系的XSLT-1.0

建立一对一关系的XSLT-1.0
EN

Stack Overflow用户
提问于 2019-03-27 04:50:10
回答 2查看 80关注 0票数 1

我生成了一个以一对多样式显示记录的报告。但是,我需要以一对一的方式显示它们。我使用XSLT转换源XML,但它不起作用。

我开发这个XSLT是为了转换XML。

然而,它不起作用。

这是我的XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?>
<Records count="2">
    <Record contentId="1442264" levelId="98" levelGuid="b085b230-e20f-41df- 
a849-f5d6811447ea" moduleId="167" parentId="0">
        <Record contentId="1608202" levelId="155" levelGuid="20b8e343-96c0-4aed- 
804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" 
type="6">16913</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" 
type="6">1608202</Field>
        </Record>
        <Record contentId="1608204" levelId="155" levelGuid="20b8e343-96c0-4aed- 
804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" 
type="6">16915</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" 
type="6">1608204</Field>
        </Record>
        <Field id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" 
type="6">1442264</Field>
    </Record>
    <Record contentId="1445144" levelId="98" levelGuid="b085b230-e20f-41df- 
a849-f5d6811447ea" moduleId="167" parentId="0">
        <Record contentId="1608203" levelId="155" levelGuid="20b8e343-96c0-4aed- 
804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" 
type="6">16914</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" 
type="6">1608203</Field>
        </Record>
        <Record contentId="1608205" levelId="155" levelGuid="20b8e343-96c0-4aed- 
804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" 
type="6">16916</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" 
type="6">1608205</Field>
        </Record>
        <Field id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" 
type="6">1445144</Field>
    </Record>
    <Metadata>
        <FieldDefinitions>
            <FieldDefinition id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" 
name="Issue ID" alias="Finding_ID" />
            <FieldDefinition id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" 
name="CAP ID" alias="Remediation_Plan_ID" />
            <FieldDefinition id="17182" guid="e950ebab-1bf6-4fc8-818b-88a54fd12f89" 
name="CAP Title" alias="Name" />
            <FieldDefinition id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" 
name="X - Tracking ID" alias="X__Tracking_ID" />
        </FieldDefinitions>
    </Metadata>
    <LevelCounts>
        <LevelCount id="98" guid="b085b230-e20f-41df-a849-f5d6811447ea" count="2" 
/>
        <LevelCount id="155" guid="20b8e343-96c0-4aed-804c-7e40b489f31b" 
count="4" />
    </LevelCounts>
</Records>

这是我的XSLT:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns="http://www.archer-tech.com/">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <ArcherRecords>
            <xsl:for-each select="Records/Record/Field[@guid='b085b230-e20f-41df- 
 a849-f5d6811447ea']/Reference">
                <ArcherRecord>
                    <IssueID>
                        <xsl:value-of select="."/>
                    </IssueID>
                    <CAPID>
                        <xsl:value-of select="../../Field[@guid='ed20bfb9-d2e9-44c2-9b22- 
 5e39d26beae4']"/>
                    </CAPID>
                    <XTrackingID>
                        <xsl:value-of select="../../Field[@guid='d378d42e-42da- 
 4a23-906a-722fcb7d761e']"/>
                    </XTrackingID>
                </ArcherRecord>
            </xsl:for-each>
        </ArcherRecords>
    </xsl:template>

</xsl:stylesheet>

我的输入是:

代码语言:javascript
复制
Issue ID                  CAP ID          X - Tracking ID
Issue-1442264             CAP-16913       1608202
                          CAP-16915       1608204
Issue-1445144             CAP-16914       1608203
                          CAP-16916       1608205

预期输出为:

代码语言:javascript
复制
Issue ID           CAP ID       X - Tracking ID
Issue-1442264      CAP-16913    1608202
Issue-1442264      CAP-16915    1608204
Issue-1445144      CAP-16914    1608203
Issue-1445144      CAP-16916    1608205

实际输出为:

代码语言:javascript
复制
 <?xml version="1.0" encoding="UTF-8"?>
 <ArcherRecords xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.archer-tech.com/"/>
EN

回答 2

Stack Overflow用户

发布于 2019-03-27 05:22:52

XSLT失败的主要原因是XML和XSLT都有不正确的空格处理。因此,表达式不匹配!

解决方案是修复linebreaks!

例如:

相关的levelGuid属性包含一个换行符和一些空格,这使得它(几乎)不可能与连接的XPath表达式的字符串值匹配。

因此,您将不得不面对一项不方便的任务:更正XML的换行。

在修复了换行符的情况后,以下XSLT-1.0代码将为您提供一些有用的输出:

代码语言:javascript
复制
<xsl:template match="/Records">
    <ArcherRecords>
        <xsl:for-each select="Record[@levelGuid='b085b230-e20f-41df-a849-f5d6811447ea']">
            <ArcherRecord>
                <IssueID>
                    <xsl:value-of select="@contentId"/>
                </IssueID>
                <xsl:for-each select="Record">
                    <CAPID>
                        <xsl:value-of select="Field[@guid='ed20bfb9-d2e9-44c2-9b22-5e39d26beae4']"/>
                    </CAPID>
                    <XTrackingID>
                        <xsl:value-of select="Field[@guid='d378d42e-42da-4a23-906a-722fcb7d761e']"/>
                    </XTrackingID>
                </xsl:for-each>
            </ArcherRecord>
        </xsl:for-each>
    </ArcherRecords>
</xsl:template>

它的输出是:

代码语言:javascript
复制
<?xml version="1.0"?>
<ArcherRecords xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:arch="http://www.archer-tech.com/">
    <ArcherRecord>
        <IssueID>1442264</IssueID>
        <CAPID>16913</CAPID>
        <XTrackingID>1608202</XTrackingID>
        <CAPID>16915</CAPID>
        <XTrackingID>1608204</XTrackingID>
    </ArcherRecord>
    <ArcherRecord>
        <IssueID>1445144</IssueID>
        <CAPID>16914</CAPID>
        <XTrackingID>1608203</XTrackingID>
        <CAPID>16916</CAPID>
        <XTrackingID>1608205</XTrackingID>
    </ArcherRecord>
</ArcherRecords>

这是你问题的答案。

现在,任务仍然是获得纯文本输出。

用于创建所需输出的模板为:

代码语言:javascript
复制
<xsl:output method="text" indent="yes" />

<xsl:template match="/Records">
    <xsl:text>Issue ID&#x9;CAP ID&#x9;&#x9;X - Tracking ID&#xa;</xsl:text>
    <xsl:for-each select="Record[@levelGuid='b085b230-e20f-41df-a849-f5d6811447ea']">
        <xsl:for-each select="Record">
            <xsl:value-of select="concat('Issue-',../@contentId)"/><xsl:text>&#x9;</xsl:text>
            <xsl:value-of select="concat('CAP-',Field[@guid='ed20bfb9-d2e9-44c2-9b22-5e39d26beae4'])"/><xsl:text>&#x9;</xsl:text>
            <xsl:value-of select="Field[@guid='d378d42e-42da-4a23-906a-722fcb7d761e']"/>
            <xsl:text>&#x9;&#xa;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

它的输出是:

代码语言:javascript
复制
Issue ID        CAP ID          X - Tracking ID
Issue-1442264   CAP-16913       1608202
Issue-1442264   CAP-16915       1608204
Issue-1445144   CAP-16914       1608203
Issue-1445144   CAP-16916       1608205
票数 0
EN

Stack Overflow用户

发布于 2019-03-27 06:13:28

您只需找到一对多XML关系的one,然后迭代该many以生成新的XML元素。

.xsl

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl" xmlns="http://www.archer-tech.com/">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <ArcherRecords>
            <xsl:for-each select='//Record[@levelGuid="b085b230-e20f-41df-a849-f5d6811447ea"]'>
              <xsl:param name="issueid">
                    <xsl:value-of select="Field[@guid='a69370c5-b6a7-4e20-a073-dd6bbd131e43']"></xsl:value-of>
                </xsl:param>
                <xsl:for-each select="Record">
                    <ArcherRecord>
                        <IssueID>Issue-<xsl:value-of select="$issueid"></xsl:value-of>
                        </IssueID>
                        <CAPID>CAP-<xsl:value-of select="Field[@guid='ed20bfb9-d2e9-44c2-9b22-5e39d26beae4']" />
                        </CAPID>
                        <XTrackingID>
                            <xsl:value-of select="Field[@guid='d378d42e-42da-4a23-906a-722fcb7d761e']" />
                        </XTrackingID>
                    </ArcherRecord>
                </xsl:for-each>
            </xsl:for-each>
        </ArcherRecords>
    </xsl:template>
</xsl:stylesheet>

根据您的XML,结果将转到

代码语言:javascript
复制
<ArcherRecords>
    <ArcherRecord>
        <IssueID>Issue-1442264</IssueID>
        <CAPID>CAP-16913</CAPID>
        <XTrackingID>1608202</XTrackingID>
    </ArcherRecord>
    <ArcherRecord>
        <IssueID>Issue-1442264</IssueID>
        <CAPID>CAP-16915</CAPID>
        <XTrackingID>1608204</XTrackingID>
    </ArcherRecord>
    <ArcherRecord>
        <IssueID>Issue-1445144</IssueID>
        <CAPID>CAP-16914</CAPID>
        <XTrackingID>1608203</XTrackingID>
    </ArcherRecord>
    <ArcherRecord>
        <IssueID>Issue-1445144</IssueID>
        <CAPID>CAP-16916</CAPID>
        <XTrackingID>1608205</XTrackingID>
    </ArcherRecord>
</ArcherRecords>

固定的换行符XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?>
<Records count="2">
    <Record contentId="1442264" levelId="98" levelGuid="b085b230-e20f-41df-a849-f5d6811447ea" moduleId="167" parentId="0">
        <Record contentId="1608202" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16913</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608202</Field>
        </Record>
        <Record contentId="1608204" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16915</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608204</Field>
        </Record>
        <Field id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" type="6">1442264</Field>
    </Record>
    <Record contentId="1445144" levelId="98" levelGuid="b085b230-e20f-41df-a849-f5d6811447ea" moduleId="167" parentId="0">
        <Record contentId="1608203" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16914</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608203</Field>
        </Record>
        <Record contentId="1608205" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0">
            <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16916</Field>
            <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608205</Field>
        </Record>
        <Field id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" type="6">1445144</Field>
    </Record>
    <Metadata>
        <FieldDefinitions>
            <FieldDefinition id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" name="Issue ID" alias="Finding_ID" />
            <FieldDefinition id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" name="CAP ID" alias="Remediation_Plan_ID" />
            <FieldDefinition id="17182" guid="e950ebab-1bf6-4fc8-818b-88a54fd12f89" name="CAP Title" alias="Name" />
            <FieldDefinition id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" name="X - Tracking ID" alias="X__Tracking_ID" />
        </FieldDefinitions>
    </Metadata>
    <LevelCounts>
        <LevelCount id="98" guid="b085b230-e20f-41df-a849-f5d6811447ea" count="2" />
        <LevelCount id="155" guid="20b8e343-96c0-4aed-804c-7e40b489f31b" count="4" />
    </LevelCounts>
</Records>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55365962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档