【问题标题】:XSLT 1.0 transformation under certain conditions特定条件下的 XSLT 1.0 转换
【发布时间】:2017-03-01 06:37:20
【问题描述】:

我有一个 xml,它是几个子系统查询的合并输出。现在我必须挑选很多信息。例如:

/合并/响应/BenutzerDaten/Deaktiviert

如果 /Merge/response/results/result/dn 以 ",o=test,c=de" 结尾,并且只有一个结果以该模式结尾:

/Merge/response/results/result/attributes/identnummer

如果 /Merge/response/results/result/dn 以“,DC=TEST,DC=DE”结尾:

/Merge/response/results/result/attributes/postalCode

最好的方法是什么?

这是我的原始 xml 的简化示例:

<?xml version="1.0" encoding="UTF-8"?>
<Merge>
    <response>
        <results>
            <result>
                <dn>cn=user1,ou=members,ou=group1,o=test,c=de</dn>
                <attributes>
                    <identnummer>re3232</identnummer>
                    <uid>user1</uid>
                    [...]
                    <adminuid>admin3</adminuid>
                </attributes>
            </result>
        </results>
    </response>
    <response>
        <results>
            <result>
                <dn>CN=user1,OU=Users,DC=TEST,DC=DE</dn>
                <attributes>
                    <postalCode>12345</postalCode>
                    <company>My Company</company>
                    [...]
                    <streetAddress>XSLT Road 1</streetAddress>
                </attributes>
            </result>
        </results>
    </response>
    <response>
        <secDN>principalName=user1,cn=Users,secDomain=Default</secDN>
        <Benutzerdaten>
            <Deaktiviert>false</Deaktiviert>
            <Gesperrt>false</Gesperrt>
            [...]
            <PasswortGueltig>true</PasswortGueltig>
        </Benutzerdaten>
    </response>
    <Nutzdaten>
        <Identifikation>
            <AdminID>admin3</AdminID>
            <BenutzerID>user1</BenutzerID>
        </Identifikation>
        <Benutzerdaten>
            <Datentyp>Account-Daten</Datentyp>
            <Datentyp>Anwendungs-Daten</Datentyp>
            <Datentyp>Benutzer-Daten</Datentyp>
        </Benutzerdaten>
    </Nutzdaten>
</Merge>

预期结果应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<UserData>
    <user>user1</user>
    <source1>
        <identnummer>re3232</identnummer>
    </source1>
    <source2>
        <postalCode>12345</postalCode>
    </source2>
    <source3>
        <Deaktiviert>false</Deaktiviert>
    </source3>
</UserData>

这是我失败的尝试:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="/Merge/response/Benutzerdaten and count(/Merge/response/results/result[dn = '*,o=test,c=de') = 1"  and count(/Merge/response/results/result[dn = '*,DC=TEST,DC=DE') = 1" >
        <UserData>
          <user>
            <xsl:value-of select="/Merge/Nutzdaten/Identifikation/BenutzerID"/>
          </user>
          <xsl:if test="/Merge/response/Benutzerdaten/*">
            <Account>
              <xsl:copy-of select="/Merge/response/Benutzerdaten/*"/>
            </Account>
          </xsl:if>
          <xsl:if test="substring(/Merge/response/results/result/dn, string-length(/Merge/response/results/result/dn) -11) = ',o=test,c=de'">
            <source1>
                <postalCode>
                    <xsl:value-of select="/Merge/response/results/result/attributes/portalCode"></xsl:value-of>
                </postalCode>
            </source1>
          </xsl:if>
          <xsl:if test="substring(/Merge/response/results/result/dn, string-length(/Merge/response/results/result/dn) -12) = ',DC=TEST,DC=DE'">
            <source2>
                <postalCode>
                    <xsl:value-of select="/Merge/response/results/result/attributes/portalCode"></xsl:value-of>
                </postalCode>
            </source2>
          </xsl:if>
          <source3>
            <Deaktiviert>
                <xsl:value-of select="/Merge/response/BenutzerDaten/Deaktiviert"></xsl:value-of>
            </Deaktiviert>
          </source3>
        </UserData>
      </xsl:when>
      <xsl:otherwise>
        <response>
          <failure>
            <xsl:choose>
              <xsl:when test="count(/Merge/response/results/result[dn = '*,o=test,c=de') > 1">
                <message>more than one result from source1</message>
              </xsl:when>
              <xsl:otherwise>
                <message>The requested object does not exist.</message>
              </xsl:otherwise>
            </xsl:choose>
          </failure>
        </response>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

【问题讨论】:

    标签: xslt xslt-1.0


    【解决方案1】:

    试试下面的:

        <xsl:param name="text" select="/Merge/response/results/result/dn[contains(text(),'o=test,c=de')]"/>
        <xsl:param name="text1" select="/Merge/response/results/result/dn[contains(text(),'DC=TEST,DC=DE')]"/>
        <xsl:choose>
            <xsl:when test="/Merge/response/Benutzerdaten and count(/Merge/response/results/result/dn [contains(text(),'o=test,c=de')]) = 1 and count(/Merge/response/results/result/dn[contains(text(),'DC=TEST,DC=DE')]) = 1" >
                <UserData>
                    <user>
                        <xsl:value-of select="/Merge/Nutzdaten/Identifikation/BenutzerID"/>
                    </user>
                    <xsl:if test="/Merge/response/Benutzerdaten/*">
                        <Account>
                            <xsl:copy-of select="/Merge/response/Benutzerdaten/*"/>
                        </Account>
                    </xsl:if>
                    <xsl:if test="substring($text, string-length($text)-11)">
                        <source1>
                            <postalCode>
                                <xsl:value-of select="/Merge/response/results/result/attributes/portalCode"></xsl:value-of>
                            </postalCode>
                        </source1>
                    </xsl:if>
                    <xsl:if test="substring($text, string-length($text)-12)">
                        <source2>
                            <postalCode>
                                <xsl:value-of select="/Merge/response/results/result/attributes/postalCode"></xsl:value-of>
                            </postalCode>
                        </source2>
                    </xsl:if>
                    <source3>
                        <Deaktiviert>
                            <xsl:value-of select="/Merge/response/Benutzerdaten/Deaktiviert"></xsl:value-of>
                        </Deaktiviert>
                    </source3>
                </UserData>
            </xsl:when>
            <xsl:otherwise>
                <response>
                    <failure>
                        <xsl:choose>
                            <xsl:when test="count(/Merge/response/results/result/dn[contains(text(),'o=test,c=de')]) > 1">
                                <message>more than one result from source1</message>
                            </xsl:when>
                            <xsl:when test="count(/Merge/response/results/result/dn[contains(text(),'DC=TEST,DC=DE')]) > 1">
                                <message>more than one result from source2</message>
                            </xsl:when>
                            <xsl:otherwise>
                                <message>The requested object does not exist.</message>
                            </xsl:otherwise>
                        </xsl:choose>
                    </failure>
                </response>
            </xsl:otherwise>
        </xsl:choose>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多