XSLT generate-id 如果节点不存在
XSLT generate-id if node not exist
如果关键节点不存在,如何使用generate-id()?下面我有一个输入 XML 和我的转换的例子,但是如果关键节点 (StockItem/Master/Sups/Sup/Addr_ID) 不存在,数据将不会被馈送到输出文件。
我需要他们。
Input.xml
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Stock>
<StockItem>
<Master_ID>dfdbc8b0-b58a-45f8-a7ad-418802eb2045</Master_ID>
<Name>Alu brzda tlumič</Name>
<Master ID="dfdbc8b0-b58a-45f8-a7ad-418802eb2045">
<Sups>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Addr_Name>D-HOLZ , s.r.o.</Addr_Name>
</Sup>
</Sups>
</Master>
<Status>
<Amount>14.0000</Amount>
</Status>
</StockItem>
<StockItem>
<Master_ID>30f2e859-c7b1-4e04-accd-9921cdd1a6ed</Master_ID>
<Name>Alu profil Wenus </Name>
<Master ID="30f2e859-c7b1-4e04-accd-9921cdd1a6ed">
<Sups>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Addr_Name>D-HOLZ , s.r.o.</Addr_Name>
</Sup>
</Sups>
</Master>
<Status>
<Amount>59.0000</Amount>
</Status>
</StockItem>
<StockItem>
<Master_ID>9ba2042f-c88a-4b13-99d2-e0e248d940b0</Master_ID>
<Name>ANTARO 30 kg </Name>
<Master ID="9ba2042f-c88a-4b13-99d2-e0e248d940b0">
<Sups/>
</Master>
<Status>
<Amount>0.0000</Amount>
</Status>
</StockItem>
<StockItem>
<Master_ID>69cbf3bb-a116-46dd-9ea3-9e0601fe75c6</Master_ID>
<Name>lišta úchytková</Name>
<Master ID="69cbf3bb-a116-46dd-9ea3-9e0601fe75c6">
<Sups/>
</Master>
<Status>
<Amount>1.0000</Amount>
</Status>
</StockItem>
</Stock>
</Data>
我的 xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:key name="adr" match="Addr_ID" use="text()" />
<xsl:template match="Data">
<xsl:apply-templates select="Stock"/>
</xsl:template>
<xsl:template match="Stock">
<xsl:element name="SortData">
<xsl:for-each select="StockItem/Master/Sups/Sup/Addr_ID[generate-id() = generate-id(key('adr',.))]">
<xsl:element name="Sup">
<Addr_ID>
<xsl:value-of select="." />
</Addr_ID>
<xsl:for-each select="key('adr',.)">
<xsl:element name ="Item">
<xsl:element name ="Master_ID">
<xsl:value-of select="../../../@ID"/>
</xsl:element>
<xsl:element name ="Amount" >
<xsl:value-of select="../../../../Status/Amount"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我的输出 si:
<SortData>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Item>
<Master_ID>dfdbc8b0-b58a-45f8-a7ad-418802eb2045</Master_ID>
<Amount>14.0000</Amount>
</Item>
<Item>
<Master_ID>30f2e859-c7b1-4e04-accd-9921cdd1a6ed</Master_ID>
<Amount>59.0000</Amount>
</Item>
</Sup>
</SortData>
但所需的输出是:
<SortData>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Item>
<Master_ID>dfdbc8b0-b58a-45f8-a7ad-418802eb2045</Master_ID>
<Amount>14.0000</Amount>
</Item>
<Item>
<Master_ID>30f2e859-c7b1-4e04-accd-9921cdd1a6ed</Master_ID>
<Amount>59.0000</Amount>
</Item>
</Sup>
<!-- This part is missing in my output-->
<Sup>
<Addr_ID />
<!-- or <Addr_ID>none</Addr_ID-->
<Item>
<Master_ID>9ba2042f-c88a-4b13-99d2-e0e248d940b0</Master_ID>
<Amount>0.0000</Amount>
</Item>
<Item>
<Master_ID>69cbf3bb-a116-46dd-9ea3-9e0601fe75c6</Master_ID>
<Amount>1.0000</Amount>
</Item>
</Sup>
</SortData>
AFAICT 您希望在 Sup
中按 Addr_ID
对主项目进行分组 - 这可能存在也可能不存在。
这可以按如下方式完成:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="adr" match="Master" use="string(Sups/Sup/Addr_ID)" />
<xsl:template match="/Data">
<SortData>
<xsl:for-each select="Stock/StockItem/Master[generate-id() = generate-id(key('adr', string(Sups/Sup/Addr_ID)))]">
<Sup>
<Addr_ID>
<xsl:value-of select="Sups/Sup/Addr_ID"/>
</Addr_ID>
<xsl:for-each select="key('adr', string(Sups/Sup/Addr_ID))">
<Item>
<Master_ID>
<xsl:value-of select="@ID"/>
</Master_ID>
<Amount>
<xsl:value-of select="../Status/Amount"/>
</Amount>
</Item>
</xsl:for-each>
</Sup>
</xsl:for-each>
</SortData>
</xsl:template>
</xsl:stylesheet>
请注意,这假设每个 Master
最多有一个 Sup
- 而您的结构允许 Sup
在每个 Master
.[=17= 中多次出现]
如果关键节点不存在,如何使用generate-id()?下面我有一个输入 XML 和我的转换的例子,但是如果关键节点 (StockItem/Master/Sups/Sup/Addr_ID) 不存在,数据将不会被馈送到输出文件。 我需要他们。
Input.xml
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Stock>
<StockItem>
<Master_ID>dfdbc8b0-b58a-45f8-a7ad-418802eb2045</Master_ID>
<Name>Alu brzda tlumič</Name>
<Master ID="dfdbc8b0-b58a-45f8-a7ad-418802eb2045">
<Sups>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Addr_Name>D-HOLZ , s.r.o.</Addr_Name>
</Sup>
</Sups>
</Master>
<Status>
<Amount>14.0000</Amount>
</Status>
</StockItem>
<StockItem>
<Master_ID>30f2e859-c7b1-4e04-accd-9921cdd1a6ed</Master_ID>
<Name>Alu profil Wenus </Name>
<Master ID="30f2e859-c7b1-4e04-accd-9921cdd1a6ed">
<Sups>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Addr_Name>D-HOLZ , s.r.o.</Addr_Name>
</Sup>
</Sups>
</Master>
<Status>
<Amount>59.0000</Amount>
</Status>
</StockItem>
<StockItem>
<Master_ID>9ba2042f-c88a-4b13-99d2-e0e248d940b0</Master_ID>
<Name>ANTARO 30 kg </Name>
<Master ID="9ba2042f-c88a-4b13-99d2-e0e248d940b0">
<Sups/>
</Master>
<Status>
<Amount>0.0000</Amount>
</Status>
</StockItem>
<StockItem>
<Master_ID>69cbf3bb-a116-46dd-9ea3-9e0601fe75c6</Master_ID>
<Name>lišta úchytková</Name>
<Master ID="69cbf3bb-a116-46dd-9ea3-9e0601fe75c6">
<Sups/>
</Master>
<Status>
<Amount>1.0000</Amount>
</Status>
</StockItem>
</Stock>
</Data>
我的 xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:key name="adr" match="Addr_ID" use="text()" />
<xsl:template match="Data">
<xsl:apply-templates select="Stock"/>
</xsl:template>
<xsl:template match="Stock">
<xsl:element name="SortData">
<xsl:for-each select="StockItem/Master/Sups/Sup/Addr_ID[generate-id() = generate-id(key('adr',.))]">
<xsl:element name="Sup">
<Addr_ID>
<xsl:value-of select="." />
</Addr_ID>
<xsl:for-each select="key('adr',.)">
<xsl:element name ="Item">
<xsl:element name ="Master_ID">
<xsl:value-of select="../../../@ID"/>
</xsl:element>
<xsl:element name ="Amount" >
<xsl:value-of select="../../../../Status/Amount"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我的输出 si:
<SortData>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Item>
<Master_ID>dfdbc8b0-b58a-45f8-a7ad-418802eb2045</Master_ID>
<Amount>14.0000</Amount>
</Item>
<Item>
<Master_ID>30f2e859-c7b1-4e04-accd-9921cdd1a6ed</Master_ID>
<Amount>59.0000</Amount>
</Item>
</Sup>
</SortData>
但所需的输出是:
<SortData>
<Sup>
<Addr_ID>6898e66a-5315-4933-9895-a226bbec8aad</Addr_ID>
<Item>
<Master_ID>dfdbc8b0-b58a-45f8-a7ad-418802eb2045</Master_ID>
<Amount>14.0000</Amount>
</Item>
<Item>
<Master_ID>30f2e859-c7b1-4e04-accd-9921cdd1a6ed</Master_ID>
<Amount>59.0000</Amount>
</Item>
</Sup>
<!-- This part is missing in my output-->
<Sup>
<Addr_ID />
<!-- or <Addr_ID>none</Addr_ID-->
<Item>
<Master_ID>9ba2042f-c88a-4b13-99d2-e0e248d940b0</Master_ID>
<Amount>0.0000</Amount>
</Item>
<Item>
<Master_ID>69cbf3bb-a116-46dd-9ea3-9e0601fe75c6</Master_ID>
<Amount>1.0000</Amount>
</Item>
</Sup>
</SortData>
AFAICT 您希望在 Sup
中按 Addr_ID
对主项目进行分组 - 这可能存在也可能不存在。
这可以按如下方式完成:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="adr" match="Master" use="string(Sups/Sup/Addr_ID)" />
<xsl:template match="/Data">
<SortData>
<xsl:for-each select="Stock/StockItem/Master[generate-id() = generate-id(key('adr', string(Sups/Sup/Addr_ID)))]">
<Sup>
<Addr_ID>
<xsl:value-of select="Sups/Sup/Addr_ID"/>
</Addr_ID>
<xsl:for-each select="key('adr', string(Sups/Sup/Addr_ID))">
<Item>
<Master_ID>
<xsl:value-of select="@ID"/>
</Master_ID>
<Amount>
<xsl:value-of select="../Status/Amount"/>
</Amount>
</Item>
</xsl:for-each>
</Sup>
</xsl:for-each>
</SortData>
</xsl:template>
</xsl:stylesheet>
请注意,这假设每个 Master
最多有一个 Sup
- 而您的结构允许 Sup
在每个 Master
.[=17= 中多次出现]