3

XSLT TBB(Tridion 2011 SP1でXSLTメディエーターを使用)に取り組んでおり、キーワードからキー値を取得しています。

私のキーワードはこんな感じです。

Value: Some Value   
Key: Its ID is 123

これは通常のキーワードです。

フィールドを持つスキーマを作成しました。値はリストとカテゴリから選択されます。

コンポーネントソースは次のようになります。これは、TridionUIのコンポーネントから直接取得されたコンポーネントソースです。

<Content xmlns="Some Name space">
    <keywordlink xlink:href="tcm:202-9737-1024" xlink:title="Some Value"
        xmlns:xlink="http://www.w3.org/1999/xlink">Some Value</keywordlink>
</Content>

テンプレートビルダーからtcm:Componentソースを観察したところ、フィールドに属性が存在しないことがわかりました。

  <Content xmlns="Some Name space">
    <keywordlink>Some Value</keywordlink>
  </Content>

キーワードのKey値を取得したい。

私はこのようなXSLTTBBを作成しました。XSLTメディエーターを使用してXSLTTBBを実行しています。

<?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:simple="Some Name space"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
  xmlns:xh="http://www.w3.org/1999/xhtml" 
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:transform-ext="urn:tridion:transform-ext" 
  xmlns="http://www.w3.org/1999/xhtml" 
  exclude-result-prefixes="#default simple xh">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:apply-templates 
            select="tcm:Component/tcm:Data/tcm:Content/simple:Content" />
    </xsl:template>

    <xsl:template match="simple:Content">
        <xsl:value-of  select="simple:keywordlink/@*"/>
        <xsl:value-of select=document(simple:keywordlink/@xlink:href)/>
    </xsl:template>
<xsl:stylesheet>

空白の出力が表示されます。キーワードのキー値を取得したい。

tcm:Component XMLには属性がないため、空白の出力が表示されます。

そのキーワードに移動するにはどうすればよいかわかりません。

Keyの値、つまり「そのIDは123」を取得する必要があります。

誰かがこれを行う方法を助けることができますか?

4

3 に答える 3

5

XSLTメディエーターだけを使用して、キーワードフィールドで参照されているキーワードへのxlink:hrefを取得することは不可能のようです。

これを克服するために、XML内の余分なキーワード情報を「膨らませる」.NETコンパウンドを作成しました。このコンパウンドは、XSLTコンパウンドの直前に配置する必要があります。

コード:

namespace ContentManagement.TBB.Templates
{
   [TcmTemplateTitle("Inflate Keyword Info")]
    public class GetExtendedComponent : TemplateBase
    {
       public override void Transform(Engine engine, Package package)
       {
           Initialize(engine, package);

           Component component = GetComponent();
           XmlElement componentXml = component.ToXml();

           XmlNamespaceManager ns = new XmlNamespaceManager(componentXml.OwnerDocument.NameTable);
           ns.AddNamespace("ns", component.Schema.NamespaceUri);

           ItemFields fields = new ItemFields(component.Content, component.Schema);
           InflateKeywords(fields, (XmlElement)componentXml.SelectSingleNode(String.Format("//ns:{0}", component.Schema.RootElementName), ns));

           ItemFields metaFields = new ItemFields(component.Metadata, component.MetadataSchema);
           InflateKeywords(metaFields, (XmlElement)componentXml.SelectSingleNode("//ns:Metadata", ns));

           Item xmlItem = package.CreateStringItem(ContentType.Component, componentXml.OuterXml);
           package.Remove(package.GetByName(Package.ComponentName));
           package.PushItem(Package.ComponentName, xmlItem);
       }

       private void InflateKeywords(ItemFields fields, XmlElement element)
       {
           XmlNamespaceManager ns = new XmlNamespaceManager(element.OwnerDocument.NameTable);
           ns.AddNamespace("ns", element.NamespaceURI);
           Logger.Debug("NS: " + element.NamespaceURI);
           foreach (ItemField field in fields)
           {
               if (field is KeywordField)
               {
                   KeywordField keywordField = (KeywordField)field;

                   XmlNodeList nodes = element.SelectNodes(String.Format("./ns:{0}", keywordField.Name), ns);
                   foreach (XmlNode node in nodes)
                   {
                       XmlElement kwelement = (XmlElement)node;

                       Logger.Debug(String.Format("Keyword titel: {0}", keywordField.Value.Title));
                       Logger.Debug(String.Format("Keyword Element Value: {0}", kwelement.InnerText));

                       kwelement.SetAttribute("href", "http://www.w3.org/1999/xlink", keywordField.Values.First(v => v.Title.Equals(kwelement.InnerText)).Id);
                       kwelement.SetAttribute("type", "http://www.w3.org/1999/xlink", "simple");
                       kwelement.SetAttribute("title", "http://www.w3.org/1999/xlink", kwelement.InnerText);
                   }
               }
               else if (field is EmbeddedSchemaField)
               {
                   EmbeddedSchemaField embedField = (EmbeddedSchemaField)field;

                   XmlNodeList nodes = element.SelectNodes(String.Format("./ns:{0}", embedField.Name), ns);
                   int i = 0; 
                   foreach (XmlNode node in nodes)
                   {
                       XmlElement embedElement = (XmlElement)node;
                       InflateKeywords(embedField.Values[i], embedElement);
                       i++;
                   }
               }

           }
       }
    }
}
于 2012-10-08T11:27:33.423 に答える
3

キーワードのキーはリンクに保存されません(実際には、キーワードを検索するために必要な最小限の情報のみが含まれています)。したがって、キーワードをロードしてそこから読み取る必要があります。

Yoavは、XSLT内から他のアイテムを読み取る方法をここに示しました。

http://yoavniran.wordpress.com/2009/07/11/implementing-the-xslt-mediator-part-1/

このスニペットは関連しているようです:

<xsl:attribute name="alt">
    <xsl:value-of select="document(simple:image/@xlink:href)/tcm:Component/tcm:Data/tcm:Metadata/image:Metadata/image:altText"/>
</xsl:attribute>

したがって、document()呼び出しはリンクされたアイテム(この場合はマルチメディアコンポーネント)をロードし、残りの部分selectは探している値を見つけます。

キーワードXMLは次のようになります。

<?xml version="1.0"?>
<tcm:Keyword xmlns:transform-ext="urn:tridion:transform-ext" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0" 
    IsEditable="false" ID="tcm:1-233-1024">
    <tcm:Context>
        <tcm:Publication xlink:title="000 Parent Publication" xlink:href="tcm:0-1-1" 
            xlink:type="simple"/>
        <tcm:OrganizationalItem xlink:title="Places" xlink:href="tcm:1-37-512" 
            xlink:type="simple"/>
    </tcm:Context>
    <tcm:Info>
        <tcm:LocationInfo>
            <tcm:WebDAVURL>/webdav/000%20Parent%20Publication/Places/New%20Keyword.tkw</tcm:WebDAVURL>
            <tcm:Path>\000 Parent Publication\Places</tcm:Path>
        </tcm:LocationInfo>
        <tcm:BluePrintInfo>
            <tcm:OwningPublication xlink:title="000 Parent Publication" xlink:href="tcm:0-1-1" xlink:type="simple"/>
            <tcm:IsShared>false</tcm:IsShared>
            <tcm:IsLocalized>false</tcm:IsLocalized>
        </tcm:BluePrintInfo>
        <tcm:VersionInfo>
            <tcm:CreationDate>2012-06-11T09:09:03</tcm:CreationDate>
            <tcm:RevisionDate>2012-06-11T09:09:03</tcm:RevisionDate>
            <tcm:Creator xlink:title="TCMHOSTNAME\Administrator" 
                xlink:href="tcm:0-11-65552" xlink:type="simple"/>
        </tcm:VersionInfo>
        <tcm:AllowedActions>
            <tcm:Actions Managed="0" Deny="96" Allow="268560384"/>
        </tcm:AllowedActions>
    </tcm:Info>
    <tcm:Data>
        <tcm:Title>New Keyword</tcm:Title>
        <tcm:Description>New Keyword</tcm:Description>
        <tcm:Key>Key</tcm:Key>
        <tcm:IsAbstract>false</tcm:IsAbstract>
        <tcm:ParentKeywords/>
        <tcm:RelatedKeywords/>
        <tcm:MetadataSchema xlink:title="" xlink:href="tcm:0-0-0" xlink:type="simple"/>
        <tcm:Metadata/>
        <tcm:IsRoot>true</tcm:IsRoot>
    </tcm:Data>
</tcm:Keyword>
于 2012-06-11T13:13:02.403 に答える
0

この方法で実装します:-

[値]フィールドを取得するには:-

document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Title/text()

<xsl:value-of select="document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Title/text()" />

結果:

Some Value

キーフィールドを取得するには:-

document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Key/text()

<xsl:value-of select="document(simple:keywordlink/@xlink:href)/tcm:Keyword/tcm:Data/tcm:Key/text()" />

結果:

Its ID is 123
于 2012-06-11T15:26:00.390 に答える